洛谷 P2024 食物鏈(並查集)

2021-08-18 21:21:50 字數 994 閱讀 3704

題意:有三種生物a,b,c,它們的關係是a吃b,b吃c,c吃a。現在給出一些語句,判斷是否是假話,輸出假話數量。

輸入類似 a x y,如果a等於1,說明x,y是同類,a等於2說明x是y的天敵。

思路:經典的並查集題目,用x表示生物本身,x+n表示它的獵物,x+2*n表示它的敵人,具

體請看**注釋。

**如下:

#include 

#include

#include

#include

#include

const

int maxn = 5e4+2;//生物數量,分為三類:a,b,c

int n, k, ans = 0;;//k是語句數量,ans是假話數量

int fa[3 * maxn];

int read()

int find(int x)

int unity(int x, int y)

int main()

if(a == 1)

unity(x, y);//二者是同類

unity(x + n, y + n);//獵物相同

unity(x + 2*n, y + 2*n);//天敵相同

} else

if(a == 2)

if(find(x + 2*n) == find(y) || find(y) == find(x))

unity(x, y + 2*n);//x是y的天敵

unity(x + n, y);//x的獵物是y

unity(x + 2*n, y + n);//根據a吃b,b吃c,c吃a,x的天敵是y的獵物}}

printf("%d\n",ans);//輸出

return

0;}

總結:並查集用於處理集合的合併問題真是太強大了。

種類並查集 洛谷 P2024 食物鏈

動物王國中有三類動物 a,b,c,這三類動物的食物鏈構成了有趣的環形。a 吃 b,b 吃 c,c 吃 a。現有 n 個動物,以 1 n 編號。每個動物都是 a,b,c 中的一種,但是我們並不知道 它到底是哪一種。有人用兩種說法對這 n 個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示...

題解 洛谷P2024 食物鏈 並查集

這次再發一遍是因為由關押罪犯get到了一種新的做法。將並查集開到n 3,對於某個動物a來說,a n代表它吃的動物,a 2n代表吃它的動物,這樣我們就可以進行普通的並查集操作來得到答案了。注意判斷前後話語是否矛盾時應當分情況,如果是b,c同類,那麼如果b和c吃的動物或者c和b吃的動物在同乙個集合裡,那...

洛谷 P2024 食物鏈(擴充套件域並查集)

動物王國中有三類動物 a,b,c,這三類動物的食物鏈構成了有趣的環形。a 吃 b,b 吃 c,c 吃 a。現有 n 個動物,以 1 n 編號。每個動物都是 a,b,c 中的一種,但是我們並不知道 它到底是哪一種。有人用兩種說法對這 n 個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示...