题解 | 村村通工程

村村通工程

https://www.nowcoder.com/practice/d7561a459d3544728b9a9116ede7f276

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int f[N];
int find(int x){
    if(f[x]!=x)f[x]=find(f[x]);
    return f[x];
}

struct node{
    int x,y;
}a[N];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)f[i]=i;
    for(int i=0;i<m;i++){
        cin>>a[i].x>>a[i].y;
    }

    int cnt=0;
    for(int i=0;i<m;i++){
        int u=find(a[i].x);
        int v=find(a[i].y);
        if(u!=v){
            f[u]=v;
        }
    }
    for(int i=1;i<=n;i++){
        if(f[i]==i)cnt++;
    }
    cout<<cnt-1;
}

经典的并查集的考察,首先看见城镇以及路,就想到了图,再看问题,求还需要修建几条路使得联通,翻译为至少几条边使得各个节点连接,那么可以使用并查集,不联通就使得节点共同指向一个父节点。最后查看哪些节点也就是城镇自己指向自己,也就是与其它城镇没相连(除了共同的那个根节点),每次ans++,最后减去根节点即可

全部评论

相关推荐

抽纸大侠:抱抱😘,首先你还有春招,然后就算这时候没上岸也没关系,大部分人都是这样,毕业了再找也成,最后工作只是生活的一小部分,找到工作也不是一个必须的事情。不要气馁不要焦虑你只是陷入了短暂的低谷,你也一直有退路
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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