洛谷题单指南-集合-P1536 村村通

原题链接:https://www.luogu.com.cn/problem/P1536

题意解读:城镇之间现有的道路关系可以将城镇划分的若干集合,每个集合内的城镇是互通的,要计算最少增加多少条道路,使得每个集合都相通。

解题思路:

利用并查集,统计一共出现多少个集合,即p[i] = i的数量,

最少的道路数即集合数-1,即可把所有集合“串”起来,使得所有城镇可以互通。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1005;

int p[N], n, m;

int find(int x)
{
    if(p[x] == x) return x;
    return p[x] = find(p[x]);
}

void merge(int x, int y)
{
    p[find(x)] = find(y);
}

int main()
{
    int i, j;
    while(cin >> n && n != 0)
    {
        cin >> m;
        for(int i = 1; i <= n; i++) p[i] = i; //多组数据,每次都要对并查集初始化
        while(m--)
        {
            cin >> i >> j;
            merge(i, j);
        }
        int ans = 0;
        for(int i = 1; i <= n; i++)
        {
            if(p[i] == i) ans++; //p[i] = i的即根节点,也就是集合的编号
        }
        cout << ans - 1 << endl;
    }

    return 0;
}

 

posted @ 2024-03-20 11:44  五月江城  阅读(28)  评论(0编辑  收藏  举报