NOI 2001 食物鏈(種類並查集)

2021-08-29 18:47:31 字數 814 閱讀 3839

傳送門

並查集,維護種類。

father維護可追溯的根節點,num維護與根節點的關係,我們定義0表示x與根節點同類,1表示x吃根節點,2表示根節點吃x。

若d==1,而num[x]!=num[y], 則此話為假。(d==1 表示x與y為同類,而從num[x]!=num[y]可以推出 x 與 y 不同類.矛盾.)

若d==2

當num[x]=num[y] 矛盾 則此話為假

此外當num[x]=0&&num[y]=2是對的

當num[x]=1&&num[y]=0是對的

當num[x]=2&&num[y]=1是對的

這三句話 稍加觀察就會發現num[x]=(num[y]+1)%3;

此時考慮更新

自己分析一下吧 不想寫了qwq

對於這類種類並查集,我們需要分類仔細討論,歸納出更一般的判斷方法。

#include#include#define n 50005

using namespace std;

int n,k,father[n],num[n],ans;//0->x和y同類 1->x吃y 2->y吃x(y代表x的祖先)

int getfather(int x)

int main()

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

if(d==2&&x==y)

int ax=getfather(x);

int bx=getfather(y);

if(d==1)

else if(ax!=bx)

}if(d==2)

}else}}

cout<

NOI 2001 食物鏈(種類並查集)

傳送門 並查集,維護種類。father維護可追溯的根節點,num維護與根節點的關係,我們定義0表示x與根節點同類,1表示x吃根節點,2表示根節點吃x。若d1,而num x num y 則此話為假。d1 表示x與y為同類,而從num x num y 可以推出 x 與 y 不同類.矛盾.若d 2 當nu...

NOI2001 食物鏈 並查集

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

NOI2001 食物鏈 (並查集處理集合)

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