码迷,mamicode.com
首页 > 其他好文 > 详细

无向图求割顶双连通分量

时间:2015-10-02 09:00:39      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

poj1144:

模板题,不过输入的方式真的真的是非常非常蛋疼。。。记住了。。。

 1 #include<cstdio>
 2 #include<vector>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define rep(i,n) for(int i=1;i<=n;i++)
 8 #define clr(x,c) memset(x,c,sizeof(x))
 9 const int nmax=105;
10 int dfn[nmax],low[nmax],iscut[nmax],n,dfn_clock;
11 vector<int>f[nmax];
12 int get(char *ch){
13     int x=0;
14     for(int i=0;ch[i];i++)
15       x=x*10+ch[i]-0;
16     return x;
17 }
18 int dfs(int u,int fa){
19     low[u]=dfn[u]=++dfn_clock;
20     int child=0;
21     for(int i=0;i<f[u].size();i++){
22         int v=f[u][i];
23         if(!dfn[v]){
24             child++;
25             dfs(v,u);
26             low[u]=min(low[u],low[v]);
27             if(low[v]>=dfn[u])
28               iscut[u]=1;
29         }
30         else if(dfn[v]<dfn[u]&&v!=fa)
31           low[u]=min(low[u],dfn[v]);
32     }
33     if(fa<0&&child==1) iscut[u]=0;
34     return low[u];
35 
36 }
37 int main(){
38     while(scanf("%d",&n)&&n){
39         dfn_clock=0;
40         clr(dfn,0);clr(iscut,0);
41         rep(i,n) f[i].clear();
42         char ch[10];
43         while(scanf("%s",ch)==1){
44             if(ch[0]==0) break;
45             int u=get(ch);
46             while(scanf("%s",ch)==1){
47                 int v=get(ch);
48                 f[u].push_back(v);
49                 f[v].push_back(u);
50                 char t=getchar();
51                 if(t==\n) break;
52             }
53         }
54         dfs(1,-1);
55         int ans=0;
56         rep(i,n)
57           if(iscut[i])
58             ans++;
59         printf("%d\n",ans);
60     }
61     return 0;
62 }

 

无向图求割顶双连通分量

标签:

原文地址:http://www.cnblogs.com/20003238wzc--/p/4851899.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!