题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26898

思路:我们可以给定有直接边相连的两点的距离为1,那么就是求源点出发能够走偶数步的所有的点的个数。

loj 1185(bfs)_iosloj 1185(bfs)_i++_02
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<vector>
 7 using namespace std;
 8 #define MAXN 111
 9 
10 int n,m;
11 vector<vector<int> >g;
12 bool even[MAXN],odd[MAXN];
13 
14 void bfs()
15 {
16     memset(even,false,sizeof(even));
17     memset(odd,false,sizeof(odd));
18     queue<int>que;
19     que.push(1);
20     while(!que.empty()){
21         int u=que.front();
22         que.pop();
23         for(int i=0;i<g[u].size();i++){
24             int v=g[u][i];
25             int flag=0;
26             if(!odd[v]&&(u==1||even[u])){
27                 odd[v]=true;
28                 flag=1;
29             }
30             if(odd[u]&&!even[v]){
31                 even[v]=true;
32                 flag=1;
33             }
34             if(flag)que.push(v);
35         }
36     }
37 }
38 
39 
40 int main()
41 {
42     int _case,u,v,ans,t=1;
43     scanf("%d",&_case);
44     while(_case--){
45         scanf("%d%d",&n,&m);
46         g.clear();
47         g.resize(n+2);
48         while(m--){
49             scanf("%d%d",&u,&v);
50             g[u].push_back(v);
51             g[v].push_back(u);
52         }
53         bfs();
54         ans=0;
55         for(int i=1;i<=n;i++){
56             if(even[i])ans++;
57         }
58         printf("Case %d: %d\n",t++,ans);
59     }
60     return 0;
61 }
View Code