题解 | 第一题

#include <bits/stdc++.h>
#include <bits/types/FILE.h>
#include <variant>
using namespace std;

const int MAXN=1000000;

int father[MAXN];
int height[MAXN];
bool Visit[MAXN];

void Init(int n){
    for(int i=0;i<n;i++){
        father[i]=i;
        height[i]=0;
        Visit[i]=false;
    }
}

int Find(int x){
    if(x!=father[x])father[x] = Find(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 {
            father[y]=x;
            height[x]++;
        }
    }
}

int main(){
    int n,m;
    Init(MAXN);
    while(cin>>n>>m){
        Union(n, m);
        Visit[n]=true;
        Visit[m]=true;
    }
    int ans=0;
    for(int i=0;i<MAXN;i++){
        if(!Visit[i])continue;
        if(Find(i)==i)ans++;
    }
    cout<<ans<<endl;

}

并查集的数组实现,适用面更广一点,这题就是纯粹的连通集计算

全部评论

相关推荐

想玩飞盘的菠萝蜜在春...:上交✌🏻也拒?
点赞 评论 收藏
分享
LXXXXd:有点杂,想搞自动化的话没必要把法律的经历写上去
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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