AcWing 784. 强盗团伙
原题链接
简单
作者:
王小强
,
2021-02-22 22:39:39
,
所有人可见
,
阅读 358
Disjoint Set Algorithm !
#include <iostream>
#include <vector>
#include <unordered_map>
#include <numeric>
using namespace std;
int n, m;
class DSU {
public:
DSU(int n) : count_(n), p_(n + 1) {
iota(begin(p_), end(p_), 0);
}
~DSU() {}
int Find(int x) {
return p_[x] ^ x ? p_[x] = Find(p_[x]) : x;
}
void Union(const int u, const int v) {
const int pu = Find(u);
const int pv = Find(v);
if (pu == pv) return;
p_[pu] = pv;
--count_;
}
int get_count() const {
return count_;
}
private:
int count_;
vector<int> p_;
};
int main(void) {
scanf("%d", &n);
scanf("%d", &m);
DSU dsu(n);
unordered_map<int, vector<int>> mp;
while (m--) {
char op;
int a, b;
cin >> op >> a >> b;
switch (op) {
case 'F': dsu.Union(a, b); break;
case 'E': mp[a].emplace_back(b), mp[b].emplace_back(a); break;
}
}
// 我敌人的敌人也是我的朋友。
for (auto&& [k, v] : mp)
for (int i = 1; i < v.size(); ++i)
dsu.Union(v[0], v[i]);
// for (auto&& [k, v] : mp)
// for (int i = 0; i < v.size() - 1; ++i)
// dsu.Union(v[i], v[i + 1]);
printf("%d\n", dsu.get_count());
}