http://poj.org/problem?id=1144
题意:
给出图,求割点数。
思路:
关于无向图的割顶和桥,这篇博客写的挺不错,有不懂的可以去看一下http://blog.csdn.net/stillxjy/article/details/70176689
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack> 7 #include<queue> 8 #include<cmath> 9 #include<map> 10 using namespace std; 11 12 const int maxn=100+5; 13 14 int n; 15 vector<int> G[maxn]; 16 int pre[maxn],low[maxn]; 17 int iscut[maxn]; 18 int dfs_clock; 19 20 int dfs(int u,int fa) 21 { 22 int lowu=pre[u]=++dfs_clock; 23 int child=0; 24 for(int i=0;i<G[u].size();i++) 25 { 26 int v=G[u][i]; 27 if(!pre[v]) 28 { 29 child++; 30 int lowv=dfs(v,u); 31 lowu=min(lowu,lowv); 32 if(lowv>=pre[u]) iscut[u]=true; 33 } 34 else if(pre[v]<pre[u] && v!=fa) 35 lowu=min(lowu,pre[v]); 36 } 37 if(fa<0&&child==1) iscut[u]=0; 38 low[u]=lowu; 39 return lowu; 40 } 41 42 int get_int(char s[]) 43 { 44 int m=0; 45 for(int i=0;s[i];i++) 46 m=m*10+s[i]-'0'; 47 return m; 48 } 49 50 int main() 51 { 52 //freopen("D:\input.txt","r",stdin); 53 while(~scanf("%d",&n) && n) 54 { 55 for(int i=1;i<=n;i++) G[i].clear(); 56 memset(pre,0,sizeof(pre)); 57 memset(low,0,sizeof(low)); 58 memset(iscut,0,sizeof(iscut)); 59 dfs_clock=0; 60 61 char s[5]; 62 while(scanf("%s",&s)) 63 { 64 if(s[0]=='0') break; 65 int u=get_int(s); 66 while(scanf("%s",&s)) 67 { 68 int v=get_int(s); 69 G[u].push_back(v); 70 G[v].push_back(u); 71 if(getchar()==' ') break; 72 } 73 } 74 int ans=0; 75 dfs(1,-1); 76 for(int i=1;i<=n;i++) 77 if(iscut[i]) ans++; 78 printf("%d ",ans); 79 } 80 return 0; 81 }