並查集演算法

2021-08-31 11:47:59 字數 1427 閱讀 3756

#includeint pre[10];

int find(int x) /*查詢祖先節點*/

int i=x,j;

while(i!=r) /*壓縮路徑*/

return r;

}void join(int x,int y)

}int main()

}

2:食物鏈問題

/**

description

動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b, b吃c,c吃a。

現有n個動物,以1-n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。

有人用兩種說法對這n個動物所構成的食物鏈關係進行描述:

第一種說法是"1 x y",表示x和y是同類。

第二種說法是"2 x y",表示x吃y。

此人對n個動物,用上述兩種說法,一句接一句地說出k句話,這k句話有的是真的,有的是假的。當一句話滿足下列三條之一時,這句話就是假話,否則就是真話。

1) 當前的話與前面的某些真的話衝突,就是假話;

2) 當前的話中x或y比n大,就是假話;

3) 當前的話表示x吃x,就是假話。

你的任務是根據給定的n(1 <= n <= 50,000)和k句話(0 <= k <= 100,000),輸出假話的總數。

input

第一行是兩個整數n和k,以乙個空格分隔。

以下k行每行是三個正整數 d,x,y,兩數之間用乙個空格隔開,其中d表示說法的種類。

若d=1,則表示x和y是同類。

若d=2,則表示x吃y。

output

只有乙個整數,表示假話的數目。

sample input

100 7

1 101 1

2 1 2

2 2 3

2 3 3

1 1 3

2 3 1

1 5 5

sample output

3**/

#include#include#include#include#includeusing namespace std;

const int maxn=50050;

int fa[maxn*3];

int n,m;

int ans=0;

int find(int x)

}void union(int x,int y)

}int main()

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

if(num==2&&a==b)

if(num==1)else

} else if(num==2)else} }

cout

}

並查集演算法

所謂並查集,它是乙個集合,這個集合的元素也是集合,他支援三種操作 makeset x 建立乙個只有乙個元素x的集合x0,將這個集合放入並查集中 findset x 在並查集中尋找乙個元素s 注意並查集的元素s也是集合 滿足 x屬於s union x,y 將並查集中的元素s1,s2合併,其中x屬於s1...

並查集演算法

並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組的元素所在的集合合併。1 makeset s 建立乙個新的並查集,包含s個單元素集合。2 union x,y 把x ...

並查集演算法

並查集是一種資料結構。首先,我們有一群數,1,2 3,4,5 1115 而每個數又有屬於他自己的集合,例如,我們的任務就是判斷某兩個數是否屬於同乙個集合。我們把每個集合都可以看成是一棵樹,不知道什麼是樹的同學可以接著往下看 判斷兩個數是否屬於乙個集合,實際就是判斷他們的根節點是都是同乙個?劃重點,考...