HDU 1232 并查集

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int pre[1050];
bool root[1050];
int Find(int x){//找到根节点
    int r=x;
    while(r!=pre[r])
        r=pre[r];
    int i=x,j;
    while(pre[i]!=r){
        j=pre[i];
        pre[i]=r;
        i=j;
    }
    return r;
}
void mix(int x,int y){//如果两个叶子的根节点不是同一个,强行合并为同一个
    int fx=Find(x),fy=Find(y);
    if(fx!=fy)
        pre[fx]=fy;
}
int main(void) {
#ifndef ONLINE_JUDGE
    freopen("E:\\input.txt","r",stdin);
#endif // ONLINE_JUDGE
    ios::sync_with_stdio(false);
    int n,m,a,b,ans;
    while(cin>>n>>m&&n){
        for(int i=1;i<=n;i++)
            pre[i]=i;//第一开始大家都是孤立的,每一个结点的根节点都是自己
        for(int i=1;i<=m;i++)
            cin>>a>>b,mix(a,b);//开始建立关系
        memset(root,0,sizeof root);
        for(int i=1;i<=n;i++)
            root[Find(i)]=1;//找到根节点的位置
        ans=0;
        for(int i=1;i<=n;i++)
            if(root[i])//统计根节点的总数
                ans++;
        cout<<ans-1<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/shadandeajian/article/details/81331483