“六度空间”理论又称作“六度分隔”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”假如给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。 输入格式: 输入第1行给出两个正整数,分别表示社交网络图的结点数N(1<N≤103 ,表示人数)、边数M(≤33,表示社交关系数)。随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个结点的编号(节点从1到N编号)。 输出格式: 对每个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每个结节点输出一行,格式为“结点编号:(空格)百分比%”。 例: 输入样例: 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%,用C语言实现
时间: 2024-02-23 11:02:26 浏览: 58
六度空间理论、六度分隔理论.docx
以下是使用 C 语言实现的代码,采用邻接矩阵存储图:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAXN 1000
int G[MAXN][MAXN];
bool visited[MAXN];
int distance[MAXN];
void dfs(int u, int depth, int n) {
visited[u] = true;
distance[u] = depth;
for (int v = 0; v < n; v++) {
if (G[u][v] && !visited[v] && depth < 6) {
dfs(v, depth + 1, n);
}
}
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d %d", &u, &v);
G[u - 1][v - 1] = G[v - 1][u - 1] = 1;
}
for (int i = 0; i < n; i++) {
int cnt = 0;
for (int j = 0; j < n; j++) {
visited[j] = false;
distance[j] = 0;
}
dfs(i, 0, n);
for (int j = 0; j < n; j++) {
if (distance[j] > 0 && distance[j] <= 6) {
cnt++;
}
}
printf("%d: %.2f%%\n", i + 1, (double)cnt / n * 100);
}
return 0;
}
```
首先读入图的节点数和边数,然后使用邻接矩阵存储图。
接下来对每个节点进行遍历,计算与该节点距离不超过6的节点数。具体实现是采用 DFS 遍历,对于每个节点,从它开始进行 DFS 遍历,标记距离不超过6的节点,并统计个数。最后输出每个节点的结果即可。
注意,因为题目中节点从1到N编号,而数组下标从0开始,因此在读入边的时候需要将节点编号减1。在输出结果的时候需要将节点编号加1。
阅读全文