编辑
2023-10-21
数据结构与算法
00
请注意,本文编写于 566 天前,最后修改于 566 天前,其中某些信息可能已经过时。

反并查集 如果是朋友,合并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 许可协议。转载请注明出处!