POJ 1144 Network(割点)

题目链接:http://poj.org/problem?id=1144

题意:给定一个连通的无向图。求割点的个数。

思路:割点:

(1)DFS,记录节点的dfn值、low值和father值;

(2)对于每个节点v,其father为u,若dfn[u]<=low[v],则u为割点;若根节点有多余一个的子节点,则根节点为割点。

 #include <iostream>

 #include <cstdio>

 #include <cstring>

 using namespace std;

 

 struct node

 {

     int v,next;

 };

 

 node edges[10000];

 int head[105],e;

 int n;

 int dfn[105],low[105],ID,p[105],cut[105];

 

 

 void init()

 {

     memset(head,-1,sizeof(head));

     e=0;

     ID=0;

     memset(cut,0,sizeof(cut));

     memset(dfn,0,sizeof(dfn));

 }

 

 void Add(int u,int v)

 {

     edges[e].v=v;

     edges[e].next=head[u];

     head[u]=e++;

 }

 

 void DFS(int u,int pre)

 {

     ID++;

     dfn[u]=low[u]=ID;

     p[u]=pre;

     int i,v;

     for(i=head[u];i!=-1;i=edges[i].next)

     {

         v=edges[i].v;

         if(!dfn[v])

         {

             DFS(v,u);

             low[u]=min(low[u],low[v]);

         }

         else

         {

             low[u]=min(low[u],dfn[v]);

         }

     }

 }

 

 int main()

 {

     while(scanf("%d",&n),n)

     {

         init();

         int i,u,v;

         while(scanf("%d",&u),u)

         {

             while(getchar()!='\n')

             {

                 scanf("%d",&v);

                 Add(u,v);

                 Add(v,u);

             }

         }

         DFS(1,-1);

         int ans=0,x=0;

         for(v=2;v<=n;v++)

         {

             u=p[v];

             if(u==1) x++;

             else if(dfn[u]<=low[v]) cut[u]=1;

         }

         if(x>1) cut[1]=1;

         for(i=1;i<=n;i++) ans+=cut[i];

         printf("%d\n",ans);

     }

     return 0;

 }

  

 

你可能感兴趣的:(NetWork)