六度空间

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

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中实现六度空间可以使用图论中的广度优先搜索算法(BFS)。 首先,需要定义一个结构体来表示每个人,结构体中可以包含一个数组表示与其他人的关系。例如: ```c #define MAX_PEOPLE 1000 typedef struct { int id; int relations[MAX_PEOPLE]; } Person; ``` 其中,id表示每个人的唯一标识,relations数组表示与其他人的关系,如果两个人之间有联系,则在数组中相应位置记录1,否则记录0。 接下来,可以使用一个队列来实现BFS算法,遍历整个社交网络,找到任意两个人之间的最短路径长度。例如: ```c #define MAX_QUEUE_SIZE 10000 int bfs(Person people[], int start, int end) { int visited[MAX_PEOPLE] = {0}; int distance[MAX_PEOPLE] = {0}; int queue[MAX_QUEUE_SIZE]; int front = 0, rear = 0; visited[start] = 1; queue[rear++] = start; while (front != rear) { int current = queue[front++]; if (current == end) { return distance[current]; } for (int i = 0; i < MAX_PEOPLE; i++) { if (people[current].relations[i] == 1 && !visited[i]) { visited[i] = 1; distance[i] = distance[current] + 1; queue[rear++] = i; } } } return -1; // 没有找到路径 } ``` 在上述代码中,visited数组表示每个人是否已经被访问过,distance数组表示每个人到起点的距离,queue数组表示BFS算法中使用的队列。start和end表示起点和终点的标识。算法的返回值是起点到终点的最短路径长度,如果没有找到路径则返回-1。 最后,需要读入数据并构建社交网络,例如: ```c int main() { Person people[MAX_PEOPLE]; int n, m; scanf("%d %d", &n, &m); for (int i = 0; i < n; i++) { people[i].id = i; for (int j = 0; j < n; j++) { people[i].relations[j] = 0; } } for (int i = 0; i < m; i++) { int a, b; scanf("%d %d", &a, &b); people[a].relations[b] = 1; people[b].relations[a] = 1; } int start, end; scanf("%d %d", &start, &end); int distance = bfs(people, start, end); printf("%d\n", distance); return 0; } ``` 在上述代码中,n表示社交网络中的人数,m表示人与人之间的联系数,读入n个人的标识和m个联系,构建相应的关系图。start和end表示起点和终点的标识,计算它们之间的最短路径长度并输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值