用C语言 “六度空间”理论又称作“六度分隔”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”假如给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。 输入格式: 输入第1行给出两个正整数,分别表示社交网络图的结点数N(1<N≤103 ,表示人数)、边数M(≤33,表示社交关系数)。随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个结点的编号(节点从1到N编号)。 输出格式: 对每个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每个结节点输出一行,格式为“结点编号:(空格)百分比%”。
时间: 2024-03-17 18:40:40 浏览: 19
以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define MAXN 1005
int graph[MAXN][MAXN]; // 邻接矩阵存图
bool visited[MAXN]; // 标记是否访问过
int n, m; // 节点数和边数
void bfs(int start, double* count) {
visited[start] = true;
*count += 1;
int queue[MAXN]; // 队列
int front = 0, rear = 0; // 队首和队尾
int depth = 0; // 当前遍历的深度
int last = start; // 当前深度的最后一个节点
int tail = start; // 当前深度的最后一个节点的队列中的位置
queue[rear++] = start;
while (front < rear && depth < 6) { // 当队列非空并且深度不超过6
int u = queue[front++];
for (int v = 1; v <= n; v++) { // 遍历u的所有邻居
if (graph[u][v] && !visited[v]) { // 如果v是u的邻居且未被访问过
visited[v] = true;
*count += 1;
queue[rear++] = v;
tail = rear - 1;
}
}
if (front > last) { // 如果当前深度的所有节点都已访问过
depth++;
last = tail;
}
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
graph[u][v] = graph[v][u] = 1; // 无向图,两个方向都要标记
}
for (int i = 1; i <= n; i++) {
double count = 0; // 统计距离不超过6的节点数量
for (int j = 1; j <= n; j++) visited[j] = false;
bfs(i, &count);
printf("%d: %.2f%%\n", i, count / n * 100);
}
return 0;
}
```
输入时,先输入节点数N和边数M,然后输入M条边,每条边输入两个节点编号。代码通过BFS遍历每个节点,计算每个节点到其他节点的距离,统计距离不超过6的节点数量,最终输出占总节点数的百分比。需要注意的是,由于涉及到浮点数计算,需要将count定义为double类型。