POJ 1611 嫌疑人 使用並查集

2021-06-18 03:08:09 字數 513 閱讀 9724

#include#includeusing namespace std;

//#define debug

static int p[30000];

static int num[30000];

int findset(int x)

void unionset(int s1, int s2)

else }

int main()

for (j = 0; j < m; j++)

}cout << num[findset(0)] << "\n";

} return 0;

}

兩種啟發策略:

按秩合併, 路徑壓縮

其中按秩合併在其中沒有應用,取代的是對每個集合樹的元素的數目進行紀錄,按照集合的大小進行合併。

路徑壓縮和教材上一致。

另外在程式設計的過程中uniouset(s1,s2)對s1, s2可能已經屬於同一集合的情況考慮不周導致出現錯誤。

POJ 1611經典並查集

題意 n,m。n個人,編號0 n 1,m個組合 第乙個數表示本集合個數,後面是成員。乙個成員可以在多個集合裡。0號是病人,跟她乙個組合的全是病人,問一共有多少人患病。解析 直接並查集基本模板,加入乙個vis陣列來記錄與本節點相連的樹的元素個數。最後輸出vis 0 即可。vis i 1的乙個初始化記得...

poj1611 帶權並查集

題意 有 個學生,個組,每個學生可能屬於多個組,現在 號得了 和 號一組的也會得,然後和 號一組的人,他所在的組的組員也全會得,問最後總共幾個人得了 思路 只要加乙個權值,就是這個組有多少個人 如r i 表示 所在的組有多少人 所以每次並的時候,也要把這個組的人數並過去 最後陣列 所在的組有幾個人 ...

poj 1611 並查集 題解記錄

解析 本題本質就是並查集的變形,我的想法是每一組輸入時,把最小的數作為全組的父節點,然後用乙個set記錄下所有資料 剔除重複數 最後再for迴圈set中的資料,如果該資料的父節點是0,那麼就是有被感染的嫌疑。如下 include include include includeusing namesp...