マスク付きWEEK 6 B

タイトル:

「新しい冠状肺炎」と呼ばれる新しいコロナウイルス肺炎(コロナウイルス病2019、COVID-19)は、2019年の新しいコロナウイルス感染によって引き起こされる肺炎を指します。
感染者がグループに入る場合、このグループは隔離される必要があります!
リトルAの生徒は新しいクラウン感染症と診断され、マスクを着用していませんでした。
やばい!
時間がなくなりました!
Xiao Aと直接または間接的に接触したすべての学生をできるだけ早く見つけて、感染拡大を防ぐためにそれらを隔離する必要があります。
ご存知のように、生徒のコミュニケーションは小さなグループに分けられ、生徒は同時に複数の小さなグループに参加できます。
それを解決するプログラムを書いてください!マスクを着用!

入力

テストデータの各セットについて、複数のデータセット:
最初の行は2つの整数nとm(n = m = 0は入力の終わりを示し、処理する必要がない)、nは学生の数、mは学生グループの数です。0 <n <= 3e4、0 <= m <= 5e2
学生番号は0〜n -1
small数は0です。
次に、m行、各行には、小グループの担当者の数である整数numがあります。次に、この小グループの生徒を表す整数がnum個あります。

出力

隔離する人数を出力し、データの各グループの回答出力は1行を占めます

入力例

100 4
2 1 2
5 10 13 11 12 14
2 0 1
2 99 2
200 2
1 5
5 1 2 3 4 5
1 0
0 0

出力例

4
1
1

アイデア:

この質問は、生徒が直接または間接的に接触しているかどうかに応じて、チェックと収集の考え方を採用しています。同じグループの生徒は同じセットです。2つのグループの生徒が共通部分を持っている場合、2つのセットがマージされ、それぞれが同時に記録されます。コレクション内の学生数については、学生0が配置されているコレクション内の学生数を出力するだけです。

コード:

#include <iostream>

using namespace std;

const int maxn = 3e4 + 5;
int par[maxn], rnk[maxn];

void init(int n)
{
	for (int i = 0; i < n; i++)
		par[i] = i, rnk[i] = 1;
}
int find(int x)
{
	if (par[x] == x)
		return x;
	else
		return par[x] = find(par[x]);
}
bool unite(int x, int y)
{
	x = find(x), y = find(y);
	if (x == y)
		return false;
	par[x] = y;
	rnk[y] += rnk[x];
	return true;
}


int main()
{
	int m, n;
	while (scanf("%d%d",&n,&m)&&!(n==0&&m==0))
	{
		init(n);
		while (m--)
		{
			int num, last = -1;
			scanf("%d", &num);
			for (int i = 0; i < num; i++)
			{
				int p;
				scanf("%d", &p);
				if (last != -1)
					unite(p, last);
				last = p;
			}
		}
		printf("%d\n", rnk[find(0)]);
	}
    return 0; 
}
元の記事を32件公開 Likes0 訪問数680

おすすめ

転載: blog.csdn.net/qq_43814559/article/details/105253696