C代码实现某社交网络中共有n个人,即a1,a2,..,an。当给定n,以及部分人际关系。为扩展人际关系,可利用已有的人际关系来认识一些不识之人,若只通过一人的牵线,试问哪些人员之间可间接建立起人际关系。算法:输入描述: n,(a1,a2),(a1,a3),…,(ai,ai)例如,5,(1,2),(1,3),(1,4),(2,5),(3,4)输出描述:(a,a)...(az,a)要求:各括号对的输出要求保证按按字典序或自然数递增排序。例如,(1,5)(2,3)(2,4)
时间: 2023-06-15 21:05:46 浏览: 129
网络优化中A1-A5切换事件.docx
这道题可以用并查集来解决,具体步骤如下:
1. 初始化并查集,每个人都是一个单独的集合。
2. 遍历已知的人际关系,将已知的关系合并到同一个集合中。
3. 遍历每个人,找到与他在同一集合中的人,这些人之间都可以建立人际关系。
4. 将所有符合条件的人际关系按照要求排序输出。
下面是C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 100
#define MAX_LEN 10
int fa[MAX_N + 1]; // 并查集数组
// 并查集初始化,每个人都是一个单独的集合
void init(int n) {
for (int i = 1; i <= n; i++) {
fa[i] = i;
}
}
// 并查集查找
int find(int x) {
if (fa[x] == x) {
return x;
} else {
return fa[x] = find(fa[x]);
}
}
// 并查集合并
void merge(int x, int y) {
int fx = find(x);
int fy = find(y);
if (fx != fy) {
fa[fx] = fy;
}
}
// 判断两个人是否在同一个集合中
int is_same_set(int x, int y) {
return find(x) == find(y);
}
// 比较两个人的编号,用于排序
int cmp(const void *a, const void *b) {
char s1[MAX_LEN], s2[MAX_LEN];
sprintf(s1, "(%d,", *((int *)a));
sprintf(s2, "(%d,", *((int *)b));
return strcmp(s1, s2);
}
int main() {
int n, m;
int a, b;
int ans[MAX_N * MAX_N][2];
int cnt = 0;
scanf("%d", &n);
scanf(" (%d,%d)", &a, &b); // 第一个人际关系
init(n);
merge(a, b);
// 合并已知的人际关系
for (int i = 2; i <= n * (n - 1) / 2; i++) {
scanf(" (%d,%d)", &a, &b);
merge(a, b);
}
// 找出可以建立人际关系的人
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
if (!is_same_set(i, j)) {
ans[cnt][0] = i;
ans[cnt][1] = j;
cnt++;
}
}
}
// 按照要求排序输出
qsort(ans, cnt, sizeof(ans[0]), cmp);
for (int i = 0; i < cnt; i++) {
printf("(%d,%d)", ans[i][0], ans[i][1]);
}
printf("\n");
return 0;
}
```
阅读全文