这是一道典型的bfs的题目,关键点在于设置一个last标记,标志每一层的最后一个节点,到达该节点时就层数加一
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<queue>
#include<algorithm>
#include<map>
#include<vector>
#include<cstring>
#include<math.h>
using namespace std;
int N,M;
int visit[10005]={0};
map<int,vector<int> >t;
int counted,level,last,tail;
queue<int> q;
int bfs(int V)
{
memset(visit,0,sizeof(visit));
while(!q.empty())
q.pop();
visit[V]=1;
counted=1;
level=0;
last=V;
q.push(V);
while(!q.empty())
{
int tmp=q.front();
q.pop();
for( vector<int>::iterator it=t[tmp].begin(); it!=t[tmp].end() ; it++ )
{
if(!visit[*it])
{
visit[*it]=1;
q.push(*it);
counted++;
tail=*it;
}
}
if( tmp == last )
{
level++;
last=tail;
}
if(level == 6)
{
break;
}
}
return counted;
}
int main()
{
cin>>N>>M;
int x,y;
for(int i=0;i<M;i++)
{
cin>>x>>y;
t[x].push_back(y);
t[y].push_back(x);
}
for(int i=1;i<=N;i++)
{
double ans=bfs(i);
printf("%d: %.2lf%%\n",i,ans/N*100);
//cout<<ans<<endl;
}
}