題目傳送門
核心解法(並查集):
關鍵要理清楚這些關係是怎樣的:即通過了解題意可知:假設現在有如下三種動物型別:老虎,老虎的食物,老虎的天敵。所輸入的x y都只滿足這三種型別(輸入m次去判斷關係),x y是兩個獨立的未知種類的動物(即不知道是老虎本體、食物還是天敵)。現在需要通過構建且查詢個體間的關係,因此我們需要使用並查集,只不過並查集從維護兩者間的關係到維護三者間的關係。並且並查集的模板仍然適用,可以直接套,只不過初始化時元素個數由n變為3n。原因如下:以前只需要判斷是否為同一組即可所以設定為n,但是此處有本體、食物、天敵這三個組別,不只是判斷為是否來自一組的問題。
為了便於存放, 一倍存本身,二倍存食物,三倍存天敵;但我們需要注意:天敵可以吃本身,食物是吃天敵的。
實現**:
1 #include2 #include 3using
namespace
std;45
#define max_n 500005
6int
n,m,k;
7int rank[max_n]; //
樹的高度
8int
par[max_n];
9int ans=0; //
記錄假話數量
10int
t[max_n],x[max_n],y[max_n];
11void
init()16}
1718
int find(int x)else
return par[x]=find(par[x]); //
在查詢的過程中實際上直接將父節點連線到根節點上進行優化 22}
2324
void unite(int x,int
y)else36}
3738
bool same(int x,int
y) 41
42int
main()
47init();
4849
for(int i=1;i<=m;i++)
5657
if(t==1)else
66 }else
if(t==2)
71if(same(x,y)||same(x+2*n,y))else79}
80}81 cout<82return0;
83 }
P2024 NOI2001 食物鏈 題解
動物王國中有三類動物 a,b,c,這三類動物的食物鏈構成了有趣的環形。a 吃 b,b 吃 c,c 吃 a。現有 n 個動物,以 1 n 編號。每個動物都是 a,b,c 中的一種,但是我們並不知道 它到底是哪一種。有人用兩種說法對這 n 個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示...
洛谷P2024 NOI2001 食物鏈
題目描述 動物王國中有三類動物 a,b,c,這三類動物的食物鏈構成了有趣的環形。a 吃 b,b 吃 c,c 吃 a。現有 n 個動物,以 1 n 編號。每個動物都是 a,b,c 中的一種,但是我們並不知道 它到底是哪一種。有人用兩種說法對這 n 個動物所構成的食物鏈關係進行描述 第一種說法是 1 x...
洛谷 P2024 NOI2001 食物鏈
這是一道並查集的題目。我們先來分析一下題目。有三種動物,a 吃 b,b吃 c,c 吃 a。那麼對於乙個動物來說,另乙個動物就有了三種情況 同類,天敵以及獵物。很容易可以想到,僅僅是利用普通的並查集已經無法滿足需要了,因為我們有三種情況需要表示。僅僅表示同類可以只用一倍長度的陣列,那麼如果是用三種關係...