傳送門
並查集,維護種類。
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...