小Hi 和小Ho 誤入青龍幫總部,黑叔叔請求他們協助解決一個棘手問題:幫派中混入許多臥底,調查只能獲得「某人與另一人同陣營」的資訊,無法直接判斷具體陣營。需要一個程序支援兩種操作:
這是典型的動態連通性問題。使用並查集維護陣營關係:
map)。Find 操作,使時間複雜度趨近 O(α(n))。#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
int father[MAXN];
map<string, int> idx;
int id = 0;
int Find(int x) {
return x != father[x] ? father[x] = Find(father[x]) : father[x];
}
void Union(int x, int y) {
int fx = Find(x), fy = Find(y);
if (fx != fy) father[fx] = fy;
}
int getIdx(const string& name) {
if (idx.count(name)) return idx[name];
idx[name] = ++id;
father[id] = id;
return id;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
while (cin >> n) {
idx.clear();
id = 0;
for (int i = 1; i < MAXN; ++i) father[i] = i;
for (int i = 0; i < n; ++i) {
int op; string name1, name2;
cin >> op >> name1 >> name2;
int u = getIdx(name1), v = getIdx(name2);
if (op == 0) Union(u, v);
else cout << (Find(u) == Find(v) ? "yes" : "no") << '\n';
}
}
return 0;
}
輸入 10 次操作,輸出 yes no yes yes,正確識別出同陣營關係。