poj 1182 帶權並查集

2021-06-08 14:21:13 字數 1386 閱讀 2654

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

帶權並查集和普通並查集最大的區別在於帶權並查集合並的是可以推算關係的點的集合(可以通過集合中的乙個已知值推算這個集合中其他元素的值)。而一般並查集合並的意圖在於這個元素屬於這個集合。帶權並查集相當於把「屬於」的定義拓展了一下,拓展為有關係的集合。

本題用rank[x]記錄x與x的最遠的祖先的關係。 這裡定義rank[x]=0表示x與x的祖先是同類。rank[x]==1表示x吃x的祖先。rank[x]==2表示x的祖先吃x;這樣定義後就與題目中輸入資料的d聯絡起來,(d-1)就可以表示x與y的關係。這樣就可以用向量的形式去推關係的公式了。我們用f(x,father[x])表示rank[x]的值;

#includeint fa[50005]=;

int rank[50005]=;

int n;

void initial()

}int getfather(int x)

void unionset(int r,int x,int y)

int istrue(int d,int x,int y)

}int main()

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

return 0;

}

poj1182 帶權並查集

題意 中文題就不描述了 思路 帶權並查集模板題 加入乙個陣列 表示這個點和它父節點的關係 表示同類,表示父親吃它,表示它吃父親 每次需要更新和父親之間的關係 include includeconst int n 50005 int p n r n n,k void init int x int fi...

POJ 1182 帶權並查集

食物鏈 time limit 1000ms memory limit 10000k total submissions 89563 accepted 26905 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n...

poj1182 帶權並查集

題意 一共有abc三種動物,a吃b,b吃c,c吃a,現在共有n個動物,編號1 n,給出k句話,判斷真假 每句話包含val,u,v val 1,代表u,v,是同類,val 2代表u吃v 假的條件為 1.與前面某些真話衝突 2.u,v,大於n 3.當val 2時,u v,即不能自己吃自己 思路 有聯絡的...