POJ 2524のユビキタス宗教(互いに素セット)

それらすべてを追跡することは困難であることを世界で非常に多くの異なる宗教、今日があります。あなたはあなたの大学の多くの異なる宗教の学生が信じる方法を見つけることに興味があります。

あなたはあなたの大学の学生(0 <N <= 50000)のnがあることを知っています。あなたはすべての学生に彼らの宗教的信念を依頼することは実行不可能です。さらに、多くの学生は、自分の信念を表現する、快適ではありません。これらの問題を回避する1つの方法は、メートルを依頼することです(0 <= M <= N(N-1)/ 2)学生のペアと、彼らは同じ宗教を信じているかどうかそれらを求めるには(例えば、彼らは知っている可能性があれば、それらの両方出席同じに教会)。このデータから、あなたは一人一人が信じているのか分からないかもしれませんが、あなたは、上おそらくキャンパスに表現することができますどのように多くの異なる宗教の束縛のアイデアを得ることができます。あなたは、各学生が多くても1つの宗教のに加入していることを仮定してもよいです。

入力

入力は、ケースの数から成ります。それぞれの場合は、整数n及びmを指定する行から始まります。次メートルの線はそれぞれ、i、jは、学生がiとjが同じ宗教を信じていることを指定する二つの整数で構成されています。学生は1からnまでの番号が付けられています。入力の終了は、ここではn = m = 0の行で指定されています。

出力

各テストケースのために、単一ライン上の大学の学生が信じることが異なる宗教の最大数が続くケース番号(1から始まる)を印刷します。

サンプル入力

10 9
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
10 4
2 3
4 5
4 8
5 8
0 0

サンプル出力

Case 1: 1
Case 2: 7

ヒント

Huge input, scanf is recommended. 

質問の意味の説明:

二人の学生とのそれぞれは、1-N、およびm番号n個の学生は、学生のグループの数を与える与え、二人の学生は、同じ宗教的信念を表します。どのように多くの異なる宗教の学生を求めてN信仰。

ACコード:

#include<stdio.h>**

int f[50005];

void inti(int n)
{
	for(int i=1;i<=n;i++)
		f[i]=i;
	return ;
}

int fget(int i)
{
	if(f[i]==i)
		return i;
	f[i]=fget(f[i]);
	return f[i];
}

void merge(int x,int y)
{
	int t1,t2;
	t1=fget(x);
	t2=fget(y);
	
	if(t1!=t2)
		f[t2]=t1;
	return ; 
}

int main(void)
{
	int n,m,i,x,y,t=1;
	while(~scanf("%d%d",&n,&m)){
		if(m==0&&n==0)
			break;
		
		inti(n);
		for(i=1;i<=m;i++){
			scanf("%d%d",&x,&y);
			merge(x,y);
		}
		
		int count=0;
		for(i=1;i<=n;i++)
			if(f[i]==i)
				count++;
		printf("Case %d: %d\n",t++,count);
	}
	return 0;
}
公開された53元の記事 ウォンの賞賛1 ビュー1329

おすすめ

転載: blog.csdn.net/fgets__/article/details/104333915