并查集——畅通工程

畅通工程

https://www.nowcoder.com/practice/4878e6c6a24e443aac5211d194cf3913?tpId=40&&tqId=21457&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking

#include<iostream>
#include<cstdio>

using namespace std;

const int MAX=1000;

int father[MAX];
int height[MAX];

void Initial(int n){
    for(int i=0;i<n;i++){                //初始化,每个节点父节点是自己,高度为0
        father[i]=i;                        //模拟初始时每个城镇都是孤立的
        height[i]=0;
    }
}

int Find(int x){                            //查找根结点
    if(x!=father[x])
        father[x]=Find(father[x]);            //一直循环找到x=father[x],根结点
    return father[x];
}

void Union(int x ,int y){
    x=Find(x);
    y=Find(y);
    if(x!=y){                            //矮树作为高树的子树
        if(height[x]<height[y])
            father[x]=y;
        else if(height[x]>height[y])
            father[y]=x;
        else{                            //遇到相同情况,让y加入到x中去
            father[y]=x;
            height[x]++;
        }
    }
    return ;
}

int main(){
    int n,m;
    while(scanf("%d",&n)!=EOF){
        if(n==0)
            break;
        scanf("%d",&m);
        Initial(n);
        while(m--){
            int x,y;
            scanf("%d",&x);
            scanf("%d",&y);
            Union(x,y);                    //读入已经建成的道路,联通道路==合并集合
        }
        int answer=-1;
        for(int i=0;i<=n;i++){            //最后计算所有结点被保存到几个集合中即可
            if(Find(i)==i)                //一个点在几个图中,即还需要最少建立几条路联通
                answer++;
        }
        printf("%d\n",answer);
    }
    return 0;
}
    
全部评论

相关推荐

07-02 13:52
门头沟学院 Java
点赞 评论 收藏
分享
牛客92804383...:在他心里你已经是他的员工了
点赞 评论 收藏
分享
能干的三文鱼刷了10...:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务