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 带权并查集的主要内容,如果未能解决你的问题,请参考以下文章
CF Round410 D. Mike and distribution