天天看點

POJ-1144-Network

       這個題是個模闆題吧,就是求割點的個數,直接代碼吧。

代碼:

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAX 2001
using namespace std;
int n,e,t,root,pnt[MAX],head[MAX],nxt[MAX],vis[MAX],cut[MAX],dfn[MAX],low[MAX];
void add(int u,int v)
{
    pnt[e]=v,nxt[e]=head[u],head[u]=e++;
}
void dfs(int u,int fa)
{
    int v,cnt=0,flag=1;
    vis[u]=1;
    dfn[u]=low[u]=++t;
    for(int i=head[u];i!=-1;i=nxt[i])
    {
	v=pnt[i];
	if(v==fa&&flag)
	{
	    flag=0;
	    continue;
	}
	if(!vis[v])
	{
	    dfs(v,u);
	    cnt++;
	    low[u]=min(low[u],low[v]);
	    if((u==root&&cnt>1)||(u!=root&&low[v]>=dfn[u]))
		cut[u]=1;
	}
	else if(vis[v]==1)
	    low[u]=min(low[u],dfn[v]);
    }
    vis[u]=2;
}
int main()
{
    int n;
    while(scanf("%d",&n)&&n)
    {
	t=e=0;
	root=1;
	memset(head,-1,sizeof(head));
	memset(low,0,sizeof(low));
	memset(dfn,0,sizeof(dfn));
	memset(vis,0,sizeof(vis));
	memset(cut,0,sizeof(cut));
	int m;
	while(scanf("%d",&m)&&m)
	{
	    while(getchar()!='\n')
	    {
		int ita;
		scanf("%d",&ita);
		add(m,ita);
		add(ita,m);
	    }
	}
	dfs(1,-1);
	int ans=0;
	for(int i=1;i<=n;i++)
	    if(cut[i])
		ans++;
	printf("%d\n",ans);
    }
    return 0;
}