套模板
#include <stdio.h>
#include <string.h>
#include <set>
#include <algorithm>
using namespace std;
const int MAXN = 10000;
struct Edge
{
int to,next;
}edge[MAXN];
int tot;
int head[110];
set<int> s;
int Low[110],DFN[110];
int n,index,res;
void init()
{
memset(head,-1,sizeof(head));
memset(Low,0,sizeof(Low));
memset(DFN,0,sizeof(DFN));
s.clear();
tot = index = res = 0;
}
void addedge(int u, int v)
{
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
}
void Tarjan(int u, int fa)
{
int child = 0;
Low[u] = DFN[u] = ++index;
for(int i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].to;
if(!DFN[v])
{
child++;
Tarjan(v,u);
Low[u] = min(Low[u],Low[v]);
if(Low[v] >= DFN[u])
s.insert(u);
}
else if(v != fa)
Low[u] = min(Low[u],DFN[v]);
}
if(fa == -1 && child < 2)
s.erase(u);
}
int main()
{
char ch;
while(scanf("%d",&n) && n)
{
getchar();
int u,v;
init();
while(scanf("%d",&u) && u)
{
getchar();
while(scanf("%d",&v))
{
ch = getchar();
addedge(u,v);
addedge(v,u);
if(ch == '\n')
break;
}
}
Tarjan(1,-1);
printf("%d\n",s.size());
}
return 0;
}