題意:有三種生物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 表示...