上面题目的c++代码
时间: 2024-12-24 19:01:26 浏览: 2
以下是解决上面团伙问题的一个基本的 C++ 代码片段,使用了并查集数据结构:
```cpp
#include <iostream>
#include <vector>
using namespace std;
class DisjointSet {
private:
vector<int> parent;
vector<int> rank;
public:
DisjointSet(int n) {
parent.resize(n);
rank.resize(n);
for (int i = 0; i < n; ++i) {
parent[i] = i;
rank[i] = 0;
}
}
int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
void unite(int x, int y) {
int rootX = find(x), rootY = find(y);
if (rootX == rootY) return;
if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY;
} else {
parent[rootY] = rootX;
if (rank[rootX] == rank[rootY])
rank[rootX]++;
}
}
};
int maxGroups(vector<pair<int, int>>& relations) {
int n = relations.size() + 1;
DisjointSet ds(n);
for (auto [type, indices] : relations) {
if (type == 0) { // 朋友关系
ds.unite(indices.first, indices.second);
} else { // 敌人关系
int root1 = ds.find(indices.first);
int root2 = ds.find(indices.second);
if (root1 != root2)
ds.unite(root1, root2);
}
}
return ds.parent.size(); // 返回团伙数量
}
int main() {
int n, m;
cin >> n >> m;
vector<pair<int, int>> relations(m);
for (int i = 0; i < m; ++i) {
cin >> relations[i].first >> relations[i].second;
}
cout << maxGroups(relations) << endl;
return 0;
}
```
这段代码首先创建了一个`DisjointSet`类,包含了查找根节点(find)和合并(unite)函数。然后通过输入的关系数据更新并查集,最后返回并查集中节点的数量作为团伙数。注意,这里的`relations`是一个二维向量,存储了每条关系(包括类型和关联的两个人)。
阅读全文