小雷有個特殊的癖好,平時喜歡收藏各種稀奇古怪的東西,譬如。。。。,還有。。。。,也包括。。。。。小雷是一個喜歡分享的童鞋,這次小雷又給大家帶來一套神奇的東西,那就是舉世無雙的冰茶幾!顧名思義,這些茶幾被冰凍住了,最主要的是他們是易碎品,畢竟被凍住了。因此小雷要很小心翼翼的移動他們。一些茶幾是凍在一起的,因此一套冰茶幾分為好幾部分,并且如果茶幾A與B凍在一起,B與C凍在一起,那么A與C也就凍在了,即冰凍狀態有傳遞性,ABC此時會看作一個整體。為了保證冰茶幾的完整性,小雷每次只能移動一整塊冰茶幾,也就是冰凍在一起的一部分。小雷想知道他需要搬幾次才能全部搬到實驗室,你能幫小雷快速計算出答案么?
多組輸入,先輸入組數T(1 < = T < = 200)。對于每組輸入,先輸入一個整數n(1 < = n < = 100000),k(0 < = k < = 100000),茶幾編號1~n。之后k行,每行兩數x,y(1 < = x,y < = n),表示第x個茶幾和第y個茶幾冰凍在一起。
對于每組輸入,先輸出”Case z:”(不帶引號)表示組數,再輸出一個整數,表示小雷需要搬動的次數。
33 11 25 21 23 45 21 22 3Example Output
Case 1: 2Case 2: 3Case 3: 3#include<stdio.h>#include<string.h>#define maxn 100005void init(int n,int a[]){ int i; for(i=1;i<=n;i++) { a[i]=i; }}int f(int a[],int x){ while(a[x]!=x) { x=a[x]; } return x;}void merge(int u,int v,int a[]){ int x,y; x=f(a,u); y=f(a,v); if(x!=y) { a[x]=y; }}int main(){ int i,j,t,n,k,u,v,count; int a[maxn]; scanf("%d",&t); for(j=1;j<=t;j++) { count=0; memset(a,0,sizeof(a)); scanf("%d%d",&n,&k); init(n,a); while(k--) { scanf("%d%d",&u,&v); merge(u,v,a); } for(i=1;i<=n;i++) { if(a[i]==i) { count++; } } printf("Case %d: %d/n",j,count); } return 0;}
新聞熱點
疑難解答