1. 程式人生 > 其它 >P1536 村村通 題解

P1536 村村通 題解

題目傳送門

C++程式碼

#include <bits/stdc++.h>

using namespace std;
int n;//城鎮數目
int m;//道路數目
int x, y;   //城鎮的編號

const int N = 1010;
int fa[N];  //並查集陣列

//要深入理解這個遞歸併壓縮的過程
int find(int x) {
    if (fa[x] != x) fa[x] = find(fa[x]);
    return fa[x];
}

//加入家族集合中
void join(int c1, int c2) {
    int f1 = find(c1), f2 = find(c2);
    if (f1 != f2)fa[f1] = f2;
}

int main() {
    //輸入包含若干組測試資料
    while (cin >> n) {
        if (n == 0) break; //讀取到0是退出條件,這個可以做為標準用例,強行記下即可

        cin >> m;
        //並查集初始化
        for (int i = 1; i <= n; i++)fa[i] = i;

        //填充並查集
        for (int i = 1; i <= m; i++) {
            cin >> x >> y;
            join(x, y);
        }
        //剩餘幾個集合呢?
        int cnt = 0; //這裡有並查集的一個查詢技巧,可以通過fa[i]==i知道具體有多少個最終的集合。
        for (int i = 1; i <= n; i++) if (fa[i] == i) cnt++;
        cout << cnt - 1 << endl;
    }
    return 0;
}