Week6:マスクを着用! - 互いに素セット

タイトル説明
新規コロナウイルス肺炎(コロナウイルス病2019、COVID- 19)は、 肺炎によって引き起こさ2019新規コロナウイルス感染を意味する「新しいクラウン肺炎」と呼ばれます。
場合はグループに感染した人が、その後、このグループの必要性を単離することにします!
小さな生徒が新しいクラウン感染症と診断された、とマスクを着用していません!
リスク!
時間が不足しています!
学生を介してすべての学生や小規模A直接または間接的な接触を可能な限り迅速に見つける必要がある、彼らはより広い範囲の拡大を防ぐために隔離されます。
我々はすべて知っているように、学生のコミュニケーションが小グループであってもよく、学生はまた、複数の小グループに参加することができます。
解決するためにプログラムを書いてください!マスクを着用してください!

入力フォーマットの
各試験のために複数のデータセット:
最初の二つの整数n及び行動M Mは、学生のグループの数であり、(N = M = 0は、入力の終了を示す処理する必要がない)、nは学生の数です。0 <N <= 3E4、0 <= M <= 5E2
〜N-1 0の学生数
少数0
そして、m行、それぞれの人、すなわち整数NUM小グループの数を有しています。小グループの学生を表す整数NUMが続きます。

出力形式
、出力アイソレーション数、回答がライン毎の各データの出力であります

ケースを入力します。

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

アイデアの分析
この質問には存在しないので、実際には、今、何の学校はありません(エスケープ

実際には、あなたはすぐに話題を乗り越えることができ、これは互いに素セットであることがわかりました。
全体のプロセスは、「リーダー」のすべてのポイントを見つけることですので、個人的に私はすべて同じ「リーダー」はコミュニティである必要があり、「父探しセット」と呼ば互いに素セットを好みます。

アイデアがあること、非常にはっきりしているので、入力されたデータは、父親の事を探しています。
回避タイムアウトに、より迅速な(武士)を見つけるために父から、経路最適化を使用することを忘れないでください

#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

int father[30002];
int rnk[30002];

int findfather(int x)//找爹
{
	if (x == father[x]) return x;
	else return father[x] = findfather(father[x]);//优化路径
}

void Union(int a, int b)//认爹
{
	a = findfather(a);
	b = findfather(b);
	if (a == b) return;

	/*if (rnk[a] > rnk[b]) father[b] = a, rnk[a] = (rnk[b] += rnk[a]);
	else father[a] = b, rnk[b] = (rnk[a] += rnk[b]);*/
	//上面是用来维护生成树的秩的

	father[b] = a;
}

int main()
{
	int n, m;
	while (cin >> n >> m)
	{
		if (n == 0 && m == 0) break;

		for (int i = 0; i < n; i++)
		{
			father[i] = i;
			rnk[i] = 1;
		}

		int num, j1, jx;
		for (int i = 0; i < m; i++)
		{
			cin >> num;
			for (int j = 0; j < num; j++)
			{
				if (j == 0)
				{
					cin >> j1;
					continue;
				}
				else
				{
					cin >> jx;
					Union(j1, jx);
				}
			}
		}

		for (int i = 0; i < n; i++)
		{
			father[i] = findfather(i);
		}

		int t = father[0];
		int ans = 0;
		for (int i = 0; i < n; i++)
		{
			if (father[i] == t) ans++;
		}

		cout << ans << endl;

	}
}

公開された21元の記事 ウォンの賞賛3 ビュー403

おすすめ

転載: blog.csdn.net/qq_44506233/article/details/105282571