输入样例:
10 9
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
输出样例:
1: 70.00%
2: 80.00%
3: 90.00%
4: 100.00%
5: 100.00%
6: 100.00%
7: 100.00%
8: 90.00%
9: 80.00%
10: 70.00%
本题的关键在于找出与某个顶点距离不超过6的顶点个数cnt,既然是要找顶点,那就要涉及图的遍历,这里采用广搜是比较合适的,我们可以弄个结构体,一个记录顶点的编号、一个记录顶点所处的层次(也就是与刚开始遍历的顶点的距离),那么cnt增加的条件就是遍历的顶点层数要小于等于6.
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#define MaxSize 2000
using namespace std;
typedef struct Node{
int u,f;
}Node;
vector<int> G[MaxSize];
int vis[MaxSize];
int bfs(int u,int cnt)
{
int deep;
Node node;
memset(vis,0,sizeof(vis));
node.u=u;node.f=0;
queue<Node> Q;
Q.push(Node{u,0});
vis[u]=1;
while(!Q.empty())
{
node=Q.front();
Q.pop();
deep=node.f+1;
for(int i=0;i<G[node.u].size();i++)
{
int v=G[node.u][i];
if(!vis[v]&&deep<=6)
{
vis[v]=1;
cnt++;
Q.push(Node{v,deep});
}
}
}
return cnt;
}
int main()
{
int N,M;
cin>>N>>M;
for(int i=0;i<M;i++)
{
int va,vb;
cin>>va>>vb;
G[va].push_back(vb);
G[vb].push_back(va);
}
for(int i=1;i<=N;i++)
printf("%d: %.2lf%%\n",i,bfs(i,1)*100.0/N);
return 0;
}