【題解】ZeroJudge a445: 新手訓練系列- 我的朋友很少

【題目敘述】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(":(")
分享本文 Share with friends