1107 并查集

本文通过一个具体的实例详细介绍了并查集算法的应用场景及其实现方式。重点解释了如何使用并查集来解决特定类型的问题,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根本不明白下标有什么作用?

从0开始和从1开始有什么区别?

/*
放入并查集的还是人而不是课程,
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
vector<int> ans,father;

bool cmp1(int a,int b){
    return a>b;
}
int find(int x){
    if(x!=father[x])
        father[x]=find(father[x]);
    return father[x];
}

void Union(int x,int y){
    int a=find(x);
    int b=find(y);
    if(a==b)
        return;
    father[a]=b;
}
int main() {
    int a,b,n,t,k;
    int course[1001]={0};
    scanf("%d",&n);
    father.resize(n+1);
    ans.resize(n+1);    //重要,别忘了分配一个恰当的空间;
    for(int i=1;i<=n;i++)
        father[i] = i;
    for(int i=1;i<=n;i++){
        scanf("%d:",&k);
        for(int j=0;j<k;j++){
            cin>>t;
            if(course[t]==0)
                course[t]=i;
            Union(i,find(course[t]));
        }
    }
    int cnt=0;
    for(int i=1;i<=n;i++)
        ans[find(i)]++;
    for(int i=1;i<=n;i++) {
        if(ans[i]!= 0)
            cnt++;
    }
    cout<<cnt<<endl;
    sort(ans.begin(),ans.end(),cmp1);
    for(int i=0;i<cnt;i++){
        cout<<ans[i];
        if(i!=cnt-1)
            cout<<" ";
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值