Uva 315 Network 判断割点

模板题,注意输出

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <vector>
#include <stack>
using namespace std;
typedef long long LL;
const int N = 1e2+5;
int head[N],tot,n;
struct Edge{
   int v,next;
}edge[N*N];
bool iscut[N];
void add(int u,int v){
   edge[tot].v=v;
   edge[tot].next=head[u];
   head[u]=tot++;
}
int dfn[N],low[N],clk;
void targin(int u,int f){
   dfn[u]=low[u]=++clk;
   int child=0;
   for(int i=head[u];~i;i=edge[i].next){
       int v=edge[i].v;
       if(v==f)continue;
       if(!dfn[v]){
         ++child;
         targin(v,u);
         low[u]=min(low[u],low[v]);
         if(f!=-1&&low[v]>=dfn[u])iscut[u]=true;
       }
       else if(dfn[v]<low[u])low[u]=dfn[v];
   }
   if(f==-1&&child>1)iscut[u]=true;
}
int main(){
    while(~scanf("%d",&n),n){
      memset(head,-1,sizeof(head));clk=tot=0;
      for(int u;;){
        scanf("%d",&u);
        if(!u)break;
        for(int v;;){
          scanf("%d",&v);
          add(u,v);
          add(v,u);
          char c=getchar(); 
          if(c=='\n')break;
         
        }
      }
      memset(iscut,false,sizeof(iscut));
      memset(dfn,0,sizeof(dfn));
      memset(low,0,sizeof(low));
      for(int i=1;i<=n;++i)
       if(!dfn[i])targin(i,-1);
      int ans=0;
      for(int i=1;i<=n;++i)
       if(iscut[i])++ans;
       printf("%d\n",ans);  
    }
    return 0;
}
View Code

 

posted @ 2016-05-12 23:43  shuguangzw  阅读(141)  评论(0编辑  收藏  举报