經典並查集

2021-09-24 11:28:04 字數 1441 閱讀 4524

小雷的冰茶几

problem description

小雷有個特殊的癖好,平時喜歡收藏各種稀奇古怪的東西,譬如。。。。,還有。。。。,也包括。。。。。小雷是乙個喜歡分享的童鞋,這次小雷又給大家帶來一套神奇的東西,那就是舉世無雙的冰茶几!

顧名思義,這些茶几被冰凍住了,最主要的是他們是易碎品,畢竟被凍住了。因此小雷要很小心翼翼的移動他們。一些茶几是凍在一起的,因此一套冰茶几分為好幾部分,並且如果茶几a與b凍在一起,b與c凍在一起,那麼a與c也就凍在了,即冰凍狀態有傳遞性,abc此時會看作乙個整體。

為了保證冰茶几的完整性,小雷每次只能移動一整塊冰茶几,也就是冰凍在一起的一部分。小雷想知道他需要搬幾次才能全部搬到實驗室,你能幫小雷快速計算出答案麼?

input

多組輸入,先輸入組數t(1 < = t < = 200)。

對於每組輸入,先輸入乙個整數n(1 < = n < = 100000),k(0 < = k < = 100000),茶几編號1~n。

之後k行,每行兩數x,y(1 < = x,y < = n),表示第x個茶几和第y個茶几冰凍在一起。

output

對於每組輸入,先輸出」case z: 」(不帶引號)表示組數,再輸出乙個整數,表示小雷需要搬動的次數。

sample input3

3 11 2

5 21 2

3 45 2

1 22 3

sample output

case 1: 2

case 2: 3

case 3: 3

推薦閱讀並查集的原理

**:

#include #include #include #include #include #include using namespace std;

int pre[100005];

int n,m;

int root(int x)

while ( i!=x )

return x;

}// 還有一種簡潔的root的壓縮路徑的方式,在帶權並查集中用到的。

/*int root(int x)

return pre[x];}*/

void join( int a, int b ) // 找大領導是誰

}int main()

for ( i=1; i<=m; i++ )

int ans = 0;

for ( i=1; i<=n; i++ )

}cout << "case " << cnt << ": " << ans << endl;

}return 0;

}

經典演算法 並查集

概述 並查集 union find sets 是一種非常精巧而實用的資料結構,它主要用於處理一些不相交集合的合併問題。一些常見的用途有求連通子圖 求最小生成樹的 kruskal 演算法和求最近公共祖先 least common ancestors,lca 等。使用並查集時,首先會存在一組不相交的動態...

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...

poj1703 經典並查集

一道非常經典的並查集,建議還可以做下hdu5971,這樣我感覺一般的並查集就並沒有神馬威脅了。祭奠我為此付出的好幾天時間。懶得加注釋,真的要想搞懂的話建議花時間自己看懂,畢竟ac 已經寫出來了。但是實在不會的話詳詢 qq1933160466。23333333333333333333333333333...