Graph Theory NO.6 HDU_1232_畅通工程_并查集

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define N 10009
int father[10009];
void Init()
{
    for(int i=0;i<N;i++)
    {
        father[i]=i;
    }
}
int Find(int n)
{
    if(father[n]!=n)
    {
        father[n]=Find(father[n]);
    }
    return father[n];
}
int Union(int n,int m)
{
    if(n!=m)
    {
        father[n]=m;
    }
    return 0;
}
int main()
{
    int n,m;
    while(~scanf("%d",&n))
    {
        if(n==0)
        {
            break;
        }
        scanf("%d",&m);
        int a,b;
        Init();
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            Union(Find(a),Find(b));
        }
        int count=0;
        for(int i=1;i<=n;i++)
        {
            if(father[i]==i)
                count++;
        }
        printf("%d\n",count-1);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37862025/article/details/78219733