六度空间

131 阅读1分钟

在这里插入图片描述
在这里插入图片描述
输入样例:

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;
}