反并查集 如果是朋友,合并a和b。
如果是敌人,合并a+n和b,b+n和a(a的敌人是b,b的敌人是a)
代码
go#include <iostream>
#include <vector>
using namespace std;
vector<int> parent;
int find(int x) {
if (x == parent[x]) {
return x;
}
return find(parent[x]);
}
void unite(int x, int y) {
int root_x = find(x);
int root_y = find(y);
if (root_x != root_y) {
parent[root_x] = root_y;
}
}
int main() {
int n, m;
cin >> n >> m;
parent.resize(2 * n + 1);
for (int i = 1; i <= 2 * n+1; ++i) {
parent[i] = i; // 初始化,每个人独立成团
}
for (int i = 1; i <= m; ++i) {
char opt;
int p, q;
cin >> opt >> p >> q;
if (opt == 'F') { // 朋友关系
unite(p, q);
} else { // 敌人关系
// 如果两者不在同一个团体,将敌人的团体合并到朋友的团体
if (find(p) != find(q)) {
unite(q + n,p);
unite(p + n,q);
}
}
}
int maxGroups = 0;
for (int i = 1; i <= n; ++i) {
if (find(i) == i) {
maxGroups++;
}
}
cout << maxGroups << endl;
return 0;
}
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!