POJ 1144 Network 割点

http://poj.org/problem?id=1144

题意:给出一个连通图,求割点的个数

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#define nMAX 105
using namespace std;
int map[nMAX][nMAX],dfn[nMAX],low[nMAX];
int times,root,n;
bool flag[nMAX];
int min(int a,int b)
{
    return a<b?a:b;
}
void tarjan(int u,int fa)
{
    int son=0;
    low[u]=dfn[u]=++times;
    for(int v=1;v<=n;v++)
    {
        if(!map[u][v])continue;
        if(!dfn[v])
        {
            son++;
            tarjan(v,u);
            low[u]=min(low[u],low[v]);
            if((u==root&&son>=2)||(u!=root&&dfn[u]<=low[v]))
            {
               flag[u]=1;
            }
        }
        else if(v!=fa)low[u]=min(low[u],dfn[v]);
    }
}
void init()
{
    times=0;
    memset(map,0,sizeof(map));
    memset(dfn,0,sizeof(dfn));
    memset(low,0,sizeof(low));
    memset(flag,0,sizeof(flag));
}
int main()
{
   int i,j;
   while(~scanf("%d",&n)&&n)
   {
       init();
       while(~scanf("%d",&i)&&i)
       {
           while(getchar()!='\n')
           {
               scanf("%d",&j);
               map[i][j]=map[j][i]=1;
           }
       }
       root=1;
       tarjan(1,-1);
       int ans=0;
       for(i=1;i<=n;i++)
           if(flag[i])ans++;
       printf("%d\n",ans);
   }
   return 0;
}

  

  

posted @ 2012-04-10 00:21  快乐.  阅读(240)  评论(0)    收藏  举报