The Suspects 並查集 超詳細題解

2021-10-06 03:03:28 字數 1459 閱讀 8881

嚴重急性呼吸系統綜合症( sars), 一種原因不明的非典型性肺炎,從2023年3月中旬開始被認為是全球威脅。為了減少傳播給別人的機會, 最好的策略是隔離可能的患者。

在not-spreading-your-sickness大學( nsysu), 有許多學生團體。同一組的學生經常彼此相通,乙個學生可以同時加入幾個小組。為了防止非典的傳播,nsysu收集了所有學生團體的成員名單。他們的標準操作程式(sop)如下:

一旦一組中有乙個可能的患者, 組內的所有成員就都是可能的患者。

然而,他們發現當乙個學生被確認為可能的患者後不容易識別所有可能的患者。你的工作是編寫乙個程式, 發現所有可能的患者。

input

輸入檔案包含多組資料。

對於每組測試資料:

第一行為兩個整數n和m, 其中n是學生的數量, m是團體的數量。0 < n <= 30000,0 <= m <= 500。

每個學生編號是乙個0到n-1之間的整數,一開始只有0號學生被視為可能的患者。

緊隨其後的是團體的成員列表,每組一行。

每一行有乙個整數k,代表成員數量。之後,有k個整數代表這個群體的學生。一行中的所有整數由至少乙個空格隔開。

n = m = 0表示輸入結束,不需要處理。

output

對於每組測試資料, 輸出一行可能的患者。

sample input

100 4

2 1 2

5 10 13 11 12 14

2 0 1

2 99 2

200 2

1 55 1 2 3 4 5

1 00 0

sample output41

1一開始只有0號學生被視為可能的患者,與0號患者直接或間接接觸的人都視為可能患者,求出所有可能的患者。

#include

#include

#include

using

namespace std;

const

int maxn=

3e4+10;

int fa[maxn]

, rank[maxn]

,a[maxn]

;void

init

(int n)

}int

find

(int x)

void

merge

(int i,

int j)

else

if(rank[x]

== rank[y]

&& x!=y)

}int

main()

while

(m--)}

int cnt =0;

for(

int i =

0; i < n; i++)}

cout << cnt << endl;

}return0;

}

並查集之The Suspects

在不傳播疾病的大學 nssu 中,有很多學生群體。同一組的學生經常互相交流,學生可以加入幾個小組。為了防止sars可能傳播,nsusu收集所有學生組的成員名單,並在其標準操作程式 sop 中執行以下規則。一旦乙個小組中的成員是嫌疑犯,該組中的所有成員都是嫌疑犯。然而,他們發現,當乙個學生被認定為嫌疑...

並查集 並查集

本文參考了 挑戰程式設計競賽 和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 ...

並查集入門(普通並查集 帶刪除並查集 關係並查集)

什麼是並查集?通俗易懂的並查集詳解 普通並查集 基礎並查集 例題 題解 how many tables problem description lh boy無聊的時候很喜歡數螞蟻,而且,還給每乙隻小螞蟻編號,通過他長期的觀察和記錄,發現編號為i的螞蟻會和編號為j的螞蟻在一起。現在問題來了,他現在只有...