题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26898
思路:我们可以给定有直接边相连的两点的距离为1,那么就是求源点出发能够走偶数步的所有的点的个数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define MAXN 111 int n,m;
vector<vector<int> >g;
bool even[MAXN],odd[MAXN]; void bfs()
{
memset(even,false,sizeof(even));
memset(odd,false,sizeof(odd));
queue<int>que;
que.push();
while(!que.empty()){
int u=que.front();
que.pop();
for(int i=;i<g[u].size();i++){
int v=g[u][i];
int flag=;
if(!odd[v]&&(u==||even[u])){
odd[v]=true;
flag=;
}
if(odd[u]&&!even[v]){
even[v]=true;
flag=;
}
if(flag)que.push(v);
}
}
} int main()
{
int _case,u,v,ans,t=;
scanf("%d",&_case);
while(_case--){
scanf("%d%d",&n,&m);
g.clear();
g.resize(n+);
while(m--){
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
bfs();
ans=;
for(int i=;i<=n;i++){
if(even[i])ans++;
}
printf("Case %d: %d\n",t++,ans);
}
return ;
}