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)要求:各括号对的输出要求保证按按字典序或自然数递增排序。
时间: 2023-06-15 13:06:10 浏览: 216
C++实现各种排序算法排序性能的比较,如果有更好的算法,替换相应的算法就可以
这道题可以使用并查集来解决。对于每一个人,我们可以将其看作一个节点,并将已知的人际关系转化为边。然后使用并查集来维护这些节点之间的关系,最终找到所有间接建立人际关系的人员。
具体地,我们可以使用一个数组parent来记录每个节点的父节点,初始时每个节点的父节点为其自身。然后遍历所有已知的人际关系,将两个人所在的集合合并,即将其中一个人的父节点设置为另一个人的父节点。最后再次遍历所有节点,对于每个节点,查找其祖先节点,如果其祖先节点不是自身,则说明该节点可以通过一些间接的关系与其他节点建立联系。
下面是代码实现:
```
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
int parent[MAXN];
int find(int x) {
if (parent[x] == x) {
return x;
}
return parent[x] = find(parent[x]);
}
void unite(int x, int y) {
int px = find(x), py = find(y);
if (px != py) {
parent[px] = py;
}
}
int main() {
int n, m;
cin >> n >> m;
vector<pair<int, int>> edges(m);
for (int i = 0; i < m; i++) {
cin >> edges[i].first >> edges[i].second;
}
sort(edges.begin(), edges.end());
for (int i = 1; i <= n; i++) {
parent[i] = i;
}
for (int i = 0; i < m; i++) {
unite(edges[i].first, edges[i].second);
}
vector<pair<int, int>> ans;
for (int i = 1; i <= n; i++) {
if (parent[i] != i) {
continue;
}
for (int j = i + 1; j <= n; j++) {
if (parent[j] != j) {
continue;
}
if (find(i) != find(j)) {
ans.push_back({i, j});
}
}
}
for (auto p : ans) {
cout << "(" << p.first << "," << p.second << ")" << endl;
}
return 0;
}
```
时间复杂度为O(mlogm + nlogn),其中m为边数,n为节点数。
阅读全文