CSU 2125小Z的培養皿(並查集)

2021-09-12 09:24:26 字數 1125 閱讀 2289

感謝大佬 

description

小z高中的時候特別喜歡生物,在一次做實驗的過程中,小z配置了n個培養皿,每個培養皿中有著若干種類的細菌,但由於實驗室的培養皿數量有限,老師要求小z盡可能少地使用培養皿。為此,小z只得將一些培養皿進行混合,但由於一些生物上的特殊要求,只有含有相同細菌的培養皿才能混合,否則細菌將全部死亡。這時候小z想請求你——csu(california state university)最厲害的程式設計高手,希望你幫忙解答出至少需要多少培養皿。

input

第一行為t(t ≤10),表示有t組資料。

每一組資料首先是乙個正整數n(1 ≤ n ≤ 1000),

接下來n行,每行首先乙個數k,表示這乙個培養皿中有k(1 ≤ k ≤ 100)種細菌,

接下來k個數,a_1,a_2,…,a_k,(1 ≤ a_i ≤100000)。

每個數代表一種細菌的編號,編號之間通過空格隔開,培養皿中的細菌均不相同。

output

輸出最少需要的培養皿數量,每組資料的答案佔一行

sample input23

3 1 2 3

3 3 9 7

3 4 5 10

41 1

3 1 2 3

1 44 8 7 4 512

3456

78910

sample output22

12題意給出n個培養皿,每個培養皿裡面有k種細菌,如果兩個培養皿包含相同的至少一種相同的細菌,那麼他們可以合併,最後問至少需要幾個培養皿。

解題思路

根據題意,很容易就能想到並查集。每個培養皿都相當於是乙個集合,如果含有相同的細菌,就直接把並查集合並。這個題也沒必要建圖,直接把每個培養皿中的第乙個細菌作為父節點即可。最後再遍歷每個父節點(父節點的p[x]==x)做並查集,如果查詢結果是他本身,就需要乙個培養皿,累加即可得出結果。

#includeusing namespace std;

const int maxn=1e5+5;

sets;

int pa[maxn];

int findset(int x)

int main()

printf("%d\n",ans);

}}

CSU 2125小Z的培養皿(並查集)

小z高中的時候特別喜歡生物,在一次做實驗的過程中,小z配置了n個培養皿,每個培養皿中有著若干種類的細菌,但由於實驗室的培養皿數量有限,老師要求小z盡可能少地使用培養皿。為此,小z只得將一些培養皿進行混合,但由於一些生物上的特殊要求,只有含有相同細菌的培養皿才能混合,否則細菌將全部死亡。這時候小z想請...

小z的襪子

作為乙個生活散漫的人,小z每天早上都要耗費很久從一堆五顏六色的襪子中找出一雙來穿。終於有一天,小z再也無法忍受這惱人的找襪子過程,於是他決定聽天由命 具體來說,小z把這n只襪子從1到n編號,然後從編號l到r l 儘管小z並不在意兩隻襪子是不是完整的一雙,甚至不在意兩隻襪子是否一左一右,他卻很在意襪子...

小Z的AK計畫

洛谷鏈結 在小z的家鄉,有機房一條街,街上有很多機房。每個機房裡都有一萬個人在切題。小z剛刷完codechef,準備出來逛逛。機房一條街有 n 個機房,第 i 個機房的座標為 xi 小z的家座標為 0。小z在街上移動的速度為1,即從 x1 到 x2 所耗費的時間為 x1 x2 每個機房的學生數量不同...