xdoj184求关系个数
时间: 2024-02-29 21:57:12 浏览: 86
求相关系数.exe
根据您提供的信息,我猜测您是在问算法竞赛中的题目xdoj184:关系个数。这道题的意思是给定 n 个人之间的 m 条关系,求这些人中有多少个人至少有一个朋友,即至少与另一个人有直接的关系。这个问题可以使用并查集来解决。具体的算法可以参考以下的代码实现(使用C++语言):
```
#include <iostream>
#include <vector>
using namespace std;
vector<int> parent; // parent[i]表示i的父节点
vector<int> count; // count[i]表示以i为根节点的子树中的节点个数
// 查找i的祖先节点
int find(int i) {
if (parent[i] != i) {
parent[i] = find(parent[i]); // 路径压缩
}
return parent[i];
}
// 合并i和j所在的集合
void merge(int i, int j) {
int pi = find(i);
int pj = find(j);
if (pi != pj) {
parent[pi] = pj;
count[pj] += count[pi]; // 更新pj的子树节点个数
}
}
int main() {
int n, m;
cin >> n >> m;
// 初始化并查集
parent.resize(n + 1);
count.resize(n + 1);
for (int i = 1; i <= n; i++) {
parent[i] = i;
count[i] = 1;
}
// 合并关系
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
merge(a, b);
}
// 统计答案
int ans = 0;
for (int i = 1; i <= n; i++) {
if (parent[i] == i && count[i] > 1) {
ans++;
}
}
cout << ans << endl;
return 0;
}
```
这段代码的时间复杂度为O(mα(n)),其中α(n)是阿克曼函数的反函数,可以认为是一个很小的常数。
阅读全文