题解 | 第一题

#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;

}

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

全部评论

相关推荐

03-12 21:51
门头沟学院 C++
pdd卡怎么严吗&nbsp;笔试a出来两道,第三题a出来20%直接给挂了😭😭😭
鳍足目:我a了2.5道也挂了,但是组里同学只a了1.6道进面了,而且我和他都是无实习,本硕同校,感觉全是玄学
投递拼多多集团-PDD等公司10个岗位 > 拼多多求职进展汇总
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务