CF1167C News Distribution 带权并查集

Posted hanker99

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1167C News Distribution 带权并查集相关的知识,希望对你有一定的参考价值。

https://codeforces.com/contest/1167/problem/C

题意:n个用户有m个分组,每个用户可以在多个分组里出现,也允许某个分组为空。每个用户可以把消息传递到同组的每个人,求每个用户最多把消息传递给多少个人。

思路: 带权并查集,一棵树上的任意一个人都可以把消息传递给树上的其他所有人。 rk数组维护该点所属的树拥有多少个结点(包括root)。 输出每个结点的rk值即为答案

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e5+5;
int pa[maxn];
int rk[maxn];

int find(int x)
    return pa[x]==x? x:pa[x]=find(pa[x]);


void unite(int a,int b)
    a=find(a),b=find(b);
    if(a==b) return;
    if(rk[a]<rk[b]) 
        pa[a]=b;
        rk[b]+=rk[a];
    
    else
        pa[b]=a;
        rk[a]+=rk[b];
    


int main()
    //freopen("datain.txt", "r", stdin);
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++) pa[i]=i,rk[i]=1;
    for(int i=0;i<m;i++)
        int k;cin>>k;
        if(k==0) continue;
        int last=-1,cur;
        cin>>last; last;
        for(int j=1;j<k;j++)
            cin>>cur; cur;
            unite(cur,last);
        
    
    for(int i=1;i<=n;i++)
        cout<<rk[find(i)]<< ;
    
    //cout<<rk[find(0)];
    cout<<endl;

 

以上是关于CF1167C News Distribution 带权并查集的主要内容,如果未能解决你的问题,请参考以下文章

C - News Distribution (并查集)

[CF1054C]Candies Distribution

CF Round410 D. Mike and distribution

CF967D Resource Distribution

CF1305E Kuroni and the Score Distribution

cf 1305 E. Kuroni and the Score Distribution