#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 而每個數又有屬於他自己的集合,例如,我們的任務就是判斷某兩個數是否屬於同乙個集合。我們把每個集合都可以看成是一棵樹,不知道什麼是樹的同學可以接著往下看 判斷兩個數是否屬於乙個集合,實際就是判斷他們的根節點是都是同乙個?劃重點,考...