View Code
#include<stdio.h> #include<string.h> #define maxn 110 #define maxm maxn * maxn #define inf 1000000000 int min(int a, int b) { return a < b ? a : b; } struct E { int v, next; }edge[maxm<<1]; int head[maxn], tot; int n, m; void add(int s, int t) { edge[tot].v = t; edge[tot].next = head[s]; head[s] = tot++; edge[tot].v = s; edge[tot].next = head[t]; head[t] = tot++; } int low[maxn], dfn[maxn]; int sub[maxn]; int id; void init() { tot = 0; id = 0; memset(head, -1, sizeof(head)); memset(dfn, 0, sizeof(dfn)); memset(sub, 0, sizeof(sub)); } void dfs(int u) { low[u] = dfn[u] = ++id; int i, v; for(i = head[u]; i != -1; i = edge[i].next) { v = edge[i].v; if(!dfn[v]) { dfs(v); low[u] = min(low[u], low[v]); if(low[v] >= dfn[u]) sub[u]++; } else low[u] = min(low[u], dfn[v]); } } char buf[303]; int main() { int i, j; int x, y; int sum; while( ~scanf("%d", &n) && n) { init(); while( ~scanf("%d", &x) && x) { gets(buf); sum = 0; int len = strlen(buf); buf[len] = ' '; for(i = 0; i <= len; i++) { if(buf[i] == ' ') { if(i)add(x, sum); sum = 0; } else sum = sum * 10 + buf[i] - '0'; } } dfs(1); if(sub[1] > 0) sub[1]--; int ans = 0; for(i = 1; i <= n; i++) if(sub[i]) ans++; printf("%d\n", ans); } return 0; }