标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 12551 | Accepted: 5771 |
5 5 1 2 3 4 0 6 2 1 3 5 4 6 2 0 0
1 2
1 //2016.9.16 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #define N 105 6 7 using namespace std; 8 9 int n, root, book[N], edge[N][N], num[N], low[N], Index; 10 //book用来记录哪些点是割点,edge以邻接矩阵保存图,num[i]为顶点i的时间戳,low[i]为顶点i不经过父顶点所能回到的最小时间戳 11 12 void dfs(int cur, int fa) 13 { 14 int child = 0; 15 Index++; 16 num[cur] = low[cur] = Index; 17 for(int i = 1; i <= n; i++) 18 { 19 if(edge[cur][i]==1) 20 { 21 if(num[i] == 0) 22 { 23 child++; 24 dfs(i, cur); 25 low[cur] = min(low[cur], low[i]); 26 if(cur!=root && low[i]>=num[cur]) 27 book[cur] = 1; 28 if(cur==root && child==2) 29 book[cur] = 1; 30 }else if(i != fa) 31 { 32 low[cur] = min(low[cur], num[i]); 33 } 34 } 35 } 36 return; 37 } 38 39 int main() 40 { 41 int u, v; 42 while(scanf("%d", &n) && n) 43 { 44 memset(edge, 0, sizeof(edge)); 45 memset(low, 0, sizeof(low)); 46 memset(num, 0, sizeof(num)); 47 memset(book, 0, sizeof(book)); 48 Index = 0; root = 1; 49 while(scanf("%d", &u) && u) 50 { 51 while(getchar() != ‘\n‘) 52 { 53 scanf("%d", &v); 54 edge[u][v] = 1; 55 edge[v][u] = 1; 56 } 57 } 58 dfs(1, root); 59 int cnt = 0; 60 for(int i = 1; i <= n; i++) 61 if(book[i])cnt++; 62 printf("%d\n", cnt); 63 } 64 65 return 0; 66 }
标签:
原文地址:http://www.cnblogs.com/Penn000/p/5876819.html