説明
レイは、次のような奇妙なこと、のすべての種類を収集するために、通常のように、特別な習慣を持っています。。。。そこ。。。。また、含まれています。。。。。レイは靴のようなシェアで、レイは私たちに魔法のもののセットを与え、そしてそれは、アイスコーヒーテーブルの世界ではユニークです!<O:P> </ O :P>
名前が示すように、コーヒーテーブルがライブに凍結された、最も重要なのは、すべての後に、それが凍結された、彼らは壊れやすいということです。レイので、それらを動かすのは非常に注意します。いくつかのテーブルは、テーブルをいくつかの部分の氷に分割し、凍結一緒にテーブルA及びBは、BとCは凍結共に、AおよびCは、その後に凍結しますある場合、すなわち、凍結状態が経過するように、凍結一緒あります性別、この時点でABCは全体として考慮されます。<O:P> </ O :P>
アイスコーヒーテーブルの整合性を確保するために、ブロックは、凍結一緒の一部であるレイの氷のテーブルを移動することができます。レイは彼が研究室を移動するために数回を動かすのに必要なすべてを知りたい、あなたはXiaoleiはすぐにそれに対する答えを計算することができますか?
入力
入力複数組の第1の入力グループ数T(1 <= T <= 200)。
入力の各セット、第一の入力整数nについて(1 <= N <= 100000)、K(0 <= K <= 100000)、 テーブル番号1〜N。<O:P> </ P O>
K線二つの数は、Xの行後、Y(1 <= X 、Y <= n)は、 x番目とy番目のテーブルのテーブル凍結共にを表します。
出力
各入力、出力に「ケースZ:」(引用符は)基を表し、そして次に移動するレイの必要数を表す整数を出力します。
サンプル
入力
3
3 1
1 2
5 2
1 2
3 4
5 2
1 2
2 3
出力
1ケース2:
ケース2 :. 3
ケース3 :. 3。
いくつかのグループを有する、すなわち互いに素セットの要件
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int f[100010];
void init(int n)
{
for(int i=1;i<=n;i++)
f[i] = i;
}
int getf(int v)
{
if(f[v] == v)
return v;
else
{
f[v] = getf(f[v]);
return f[v];
}
}
void Merge(int u,int v)
{
int t1,t2;
t1 = getf(u);
t2 = getf(v);
if(t1 != t2)
{
f[t2] = t1;
}
}
int main()
{
int t;
int n,k;
int u,v;
scanf("%d",&t);
for(int p=1;p<=t;p++)
{
int cnt = 0;
scanf("%d %d",&n,&k);
init(n);
for(int i=0;i<k;i++)
{
scanf("%d %d",&u,&v);
Merge(u,v);
}
for(int i=1;i<=n;i++)
{
if(f[i] == i)
cnt++;
}
printf("Case %d: %d\n",p,cnt);
}
return 0;
}