loj 1185(bfs)

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

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

 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

 

你可能感兴趣的:(bfs)