hdu 1232 畅通工程(并查集)

题意:

某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?

思路:

简单并查集

代码:

int n,m;
int fa[1005];

int findFa(int x){
    return fa[x]==x?fa[x]:fa[x]=findFa(fa[x]);
}


int main(){

    while(scanf("%d",&n),n){
        scanf("%d",&m);
        rep(i,1,n) fa[i]=i;
        while(m--){
            int a,b;
            scanf("%d%d",&a,&b);
            if(findFa(a)!=findFa(b)){
                fa[fa[a]]=b;
            }
        }
        rep(i,1,n) findFa(i);
        sort(fa+1,fa+1+n);
        int ans=0;
        fa[0]=-1;
        rep(i,1,n) if(fa[i]!=fa[i-1]) ++ans;
        printf("%d
",ans-1);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/fish7/p/4334487.html