您的位置:首页 > 其它

【杭电】[1232]畅通工程

2016-01-28 00:05 204 查看





体验一把套模板的毫无意义的爽快感

虽然这题很早以前就做过

但这次用了压缩路径加防退化

哎呀……

这套用的我都不知道把题解直接写在并查集说明 还是写到这里了……

就这一题而言……

我勒个去……

没什么说的

标准的并查集

看并查集的说明吧

【看书】并查集——合并与查询

然后输出的是 总集合数-1

便可达到畅通

[code]#include<stdio.h>
int par[1020];
int rank[1020];
int find(int m) {
    if(par[m]==m) {
        return m;
    } else
        return par[m]=find(par[m]);
}
void unite(int x,int y) {
    x=find(x);
    y=find(y);
    if(x==y)
        return;
    else {
        if(rank[x]<rank[y]) {
            par[x]=y;
        } else {
            par[y]=x;
            if(rank[x]==rank[y])
                rank[x]++;
        }
    }
}
int main() {
    int N,M;
    while(scanf("%d", &N),N) {
        scanf("%d", &M);
        for(int i=1; i<=N; i++) {
            par[i]=i;
            rank[i]=0;
        }
        while(M--) {
            int u,v;
            scanf("%d %d",&u,&v);
            unite(u,v);
        }
        int cnt=0;
        for(int i=1; i<=N; i++) {
            if(par[i]==i)
                cnt++;
        }
        printf("%d\n",cnt-1);
    }
    return 0;
}


题目地址:【杭电】[1232]畅通工程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: