(模板题)畅通工程

版权声明: https://blog.csdn.net/qq_40829288/article/details/82783272

HDU-畅通工程-1232

问题描述:

有n个点,有m个连接关系,求最少需要再建立的线段条数;

#include<iostream>
using namespace std;

const int maxn=1010;
int n,m,cnt,p,q;
int maze[maxn];

void init()
{
    for(int i=0;i<maxn;i++)
        maze[i]=i;
}

int my_find(int x)
{
    return x==maze[x]? x : my_find(maze[x]);
}

void my_union(int i,int j)
{
    int x=my_find(i);
    int y=my_find(j);
    if(x!=y)
    {
        maze[x]=y;
        cnt--;
    }
}

int main()
{
    while(cin>>n,n)//注意n和m的输入方式,题目要求是n=0时就代表输入结束,没说m
    {
        cin>>m;
        init();
        cnt=n-1;//连接n个点,在不成环的情况下需要n-1条线段;
        for(int i=0;i<m;i++)
        {
            cin>>p>>q;
            my_union(p,q);
        }
        cout<<cnt<<endl;
    }
    return 0;
}

并查集

猜你喜欢

转载自blog.csdn.net/qq_40829288/article/details/82783272
今日推荐