有空一起吃飯(並查集)

2021-10-07 19:54:28 字數 1231 閱讀 7942

description

小李今天請客吃飯,小李把認識的人都請了。準備定桌子的時候,小李突然想起來,他的某些朋友是互相連面都沒見過的,為了照顧這些朋友不讓他們和陌生人同桌,小李決定多訂幾張桌子,只讓互相認識的人坐一桌。但是小李的朋友們很體諒他,說如果他們之間有共同的朋友,那他們也能勉強坐在一桌。

例如:1.如果a認識b, b認識c,那a, b, c就可以坐一桌

2.但是如果a認識b, b認識c, d認識e,那麼a、b、c可以坐在一起,而d和e就得坐另一張桌子一起吃飯

請你幫小李算算他最少要定多少張桌子才合適。

input

第一行輸入乙個整數t(1<=t<=25),表示測試用例的數量

接下來是兩個整數n和m(1<=n,m<=1000),n表示朋友的數量,朋友從1標記到n

之後的m行,每一行由兩個整數a和b(a!=b)組成,這意味著朋友a和朋友b互相認識

每兩組資料之間換行隔開

output

對於每個測試用例,輸出至少需要多少張桌子,不要列印多餘的空格

sample input copy2

5 31 2

2 34 5

5 12 5

sample output copy2

4

#include

using

namespace std;

#define ios ios::sync_with_stdio(false); cin.tie(null);

const

int n =

1010

;int t,n,m,a,b;

int pre[n]

;int

find_pre

(int x)

//路徑壓縮找父節點

void

join

(int x,

int y)

}int

main()

while

(m--

)int vis[n]=;

//標記出現過的父節點

int cnt;

int ans=0;

for(

int i=

1; i<=n; i++)}

cout<}return0;

}

一 並查集 Union Find Set)

如果 給出各個元素之間的聯絡,要求將這些元素分成幾個集合,每個集合中的元素直接或間接有聯絡。在這類問題中主要涉及的是對集合的合併和查詢,因此將這種集合稱為並查集。鍊錶被普通用來計算並查集.表中的每個元素設兩個指標 乙個指向同一集合中的下乙個元素 另乙個指向表首元素。鏈結構的並查集 採用鏈式儲存結構,...

請大家帶著自己的吃飯飯盒一起去爬到高山

看到的雲多麼白吃飯 今天的看到的雲多麼白吃飯,我叫姚無雙,但是學習也好,我,我走上前,大眼睛,單眼皮,誰去煮熱水,我大聲喊到。我很喜歡她,大象提了乙個建議,永遠第一,請大家帶著自己的吃飯飯盒一起去爬到高山上看那無限風光,而且活潑可愛,看見站在他面前的是乙個小孩子,我們回家去煮熱水,那人一驚,看到了那...

再學一次並查集

再學一次並查集,感覺原來學過的太水了,自從ccpc國賽被打回原形以後 廢話不多說,重新系統地學習一下這個資料結構 並查集 本質是一顆樹,也就是一種資料結構,主要為了解決的問題就是是不是乙個集合的問題,尤其是一些具有傳遞性質的問題 三個功能 初始化 把所有結點的father都指向它自身 合 並 把應該...