#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
#define MAX 1000
int N, num, MIN, V=0;
bool is_AR[MAX];
//记录关节点的个数
vector<int> map[MAX];
int visited[MAX],low[MAX];
void DFSArticul( int v )
{
visited[v] = MIN = ++num;
for(int i =0; i< map[v].size(); i++)
{
int w = map[v][i];
if(visited[w]==0)
{
DFSArticul(w);
if(low[w] < MIN) MIN = low[w];
if(low[w] >= visited[v])
{
// printf("%d\n",w);
is_AR[v] = true;
}
} else if(visited[w]<MIN) MIN = visited[w];
}
low[v] = MIN;
}
void FindArticul( )
{
num = 1;
visited[1]=1;
int v=0;
for(int i=2; i<=N; i++) visited[i] = 0;
int k = map[1][v];
DFSArticul(k);
if(num < N )
{
is_AR[1] = true;
for(int i=1; i<map[1].size(); i++)
if(visited[map[1][i]]==0)
DFSArticul(map[1][i]);
}
}
int main()
{
while(scanf("%d",&N)!=EOF)
{
int a, b;
int cout = 0;
for(int i=1; i<=N; i++)
map[i].clear();
for(int i=1; i<N; i++)
{
scanf("%d %d",&a, &b);
map[a].push_back(b);
map[b].push_back(a);
}
memset(low, 0, sizeof(low));
memset(is_AR, false, sizeof(is_AR));
FindArticul();
for(int i=1; i<=N; i++)
if(is_AR[i]) cout++;
printf("%d\n",cout);
}
system("pause");
return 0;
}
刚开始以为是求图的关节点,可是发现还是WA。。。就没法了,再想的话就更难了。