B - 戴好口罩!

题意介绍

有若干小团体,每个小团体由若干个人,求一个人感染,导致直接或间接感染的总人数。

题意分析

利用并查集的思想,先将每个每个人视为一个独立的团体,然后根据输入将这些团体进行合并,并记录每个大团体的人数。

通过代码

#include<iostream>
using namespace std;

int n, m;
int par[30005], rnk[30005];

int find(int x) {
	if (par[x] == x) return x;
	else return par[x] = find(par[x]);
}

void unite(int x, int y) {
	x = find(x);
	y = find(y);
	if (x == y) return;
	if (rnk[x] > rnk[y]) swap(x, y);
	par[x] = y, rnk[y] = (rnk[x] += rnk[y]);

}

int main() {
	while (cin >> n >> m && (n!=0 || m!=0)) {
		for (int i = 0; i < n; i++) {
			par[i] = i;
			rnk[i] = 1;
		}

		int num,p,q;
		for (int i = 0; i < m; i++) {
			cin >> num;
			cin >> p;
			for (int j = 1; j < num; j++) {
				cin >> q;
				unite(p, q);
			}
		}
		cout << rnk[find(0)] << endl;

    }
}
发布了40 篇原创文章 · 获赞 0 · 访问量 1067

猜你喜欢

转载自blog.csdn.net/weixin_44934885/article/details/105181833
B
a^b
A/B
A*B
今日推荐