(补题 cf 1167C)News Distribution

题目链接(戳我)

题目大意

有n个人被分为m组,现在给第i个人传递一个消息,这个人算在的组成员都能够接收到消息并按此方法专递下去知道不能够喘息为止,请依次打印出以第i个人为消息开始到结束后能够接收到消息的人数;

解题思路

利用并查集,把处在相同组的人放在同一个集合中,第i个人所在集合的人数即为最后接收到消息的人数

代码样例

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

const int maxn=5e5+5;
int pa[maxn];
int cont[maxn];

int find_pa(int x) {
	return pa[x] == x ? x : pa[x] = find_pa(pa[x]);
}

void union_(int x,int y) {
	pa[find_pa(x)]=find_pa(y);
}

int main() {
	int n,m;
	cin >>n >>m;
	for(int i=0; i <=n ; i++)
		pa[i]=i;
	for(int i=0; i < m; i++) {
		int num;
		scanf("%d",&num);
		if(num == 0)
			continue;
		else {
			int st;
			scanf("%d",&st);
			for(int j=2; j <= num; j++) {
				int temp;
				scanf("%d",&temp);
				union_(temp,st);
			}
		}
	}
	for(int i=1; i <= n; i++)
		cont[find_pa(i)]++;
	for(int i=1; i <= n; i++)
		cout << cont[find_pa(i)] << " ";
	return 0;
}
原文地址:https://www.cnblogs.com/cafu-chino/p/11759487.html