题目链接: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 }