【題目敘述】https://zerojudge.tw/ShowProblem?problemid=a445
【解題想法】並查集,Disjoint Set Union-Find algorithm (DSU)
#include <iostream>
using namespace std;
int p[10005];
int n, m, q, a, b;
int find(int a){
if (p[a] == a) return a;
else {
p[a] = find(p[a]);
return p[a];
}
}
int main() {
cin >> n >> m >> q;
for (int i = 0; i < n; i++){
p[i] = i;
}
for (int i = 0; i < m; i++){
cin >> a >> b;
a--;
b--;
p[find(a)] = find(b);
}
for (int i = 0; i < q; i++){
cin >> a >> b;
if (find(a-1) == find(b-1)) cout << ":)\n";
else cout << ":(\n";
}
}
Python code (credit: Amy Chou)
def Find(a):
if p[a] == a:
return a
else:
p[a] = Find(p[a])
return p[a]
N, M, Q = map(int, input().split())
p = [i for i in range(N+1)]
for i in range(M):
A, B = map(int, input().split())
A = Find(A)
B = Find(B)
if A != B:
p[B] = A
for i in range(Q):
A, B = map(int, input().split())
if Find(A) == Find(B):
print(":)")
else:
print(":(")