1144

来源:互联网 发布:php专业培训 编辑:程序博客网 时间:2024/05/18 00:30
#include <cstdio>#include <string>using namespace std;struct edge{int vertex;edge *next;};int n;edge *g[101];edge mem[10000];int index;int ans, dfs_order, dfn[101], low[101], rchilden;bool cut[101];bool input_build(){scanf("%d", &n);if(0 == n){return false;}index = 0;memset(g, NULL, sizeof(g));int u, v;char tmp;while(true){scanf("%d%*c", &u);if(0 == u){break;}while(true){scanf("%d%c", &v, &tmp);edge *t = &mem[index];++index;t ->next = g[u];g[u] = t;t ->vertex = v;t = &mem[index];++index;t ->next = g[v];g[v] = t;t ->vertex = u;if('\n' == tmp){break;}}}return true;}void tarjan(const int parent, const int u){++dfs_order;dfn[u] = low[u] = dfs_order;for(edge *p = g[u]; p; p = p ->next){if(0 == dfn[p ->vertex]){tarjan(u, p ->vertex);low[u] = min(low[u], low[p ->vertex]);if(1 == u){++rchilden;}else if(dfn[u] <= low[p ->vertex] && !cut[u]){++ans;cut[u] = true;}}else if(parent != p ->vertex){low[u] = min(low[u], dfn[p ->vertex]);}}}int main(){while(input_build()){ans = 0;dfs_order = 0;rchilden = 0;memset(dfn, 0, sizeof(dfn));memset(low, 0, sizeof(low));memset(cut, false, sizeof(cut));tarjan(-1, 1);if(rchilden > 1){cut[1] = true;++ans;}printf("%d\n", ans);}return 0;}

 
原创粉丝点击