P2024 NOI2001 食物鏈(洛谷)

2022-08-17 15:30:19 字數 1217 閱讀 1473

題目傳送門

核心解法(並查集):

關鍵要理清楚這些關係是怎樣的:即通過了解題意可知:假設現在有如下三種動物型別:老虎,老虎的食物,老虎的天敵。所輸入的x y都只滿足這三種型別(輸入m次去判斷關係),x y是兩個獨立的未知種類的動物(即不知道是老虎本體、食物還是天敵)。現在需要通過構建且查詢個體間的關係,因此我們需要使用並查集,只不過並查集從維護兩者間的關係到維護三者間的關係。並且並查集的模板仍然適用,可以直接套,只不過初始化時元素個數由n變為3n。原因如下:以前只需要判斷是否為同一組即可所以設定為n,但是此處有本體、食物、天敵這三個組別,不只是判斷為是否來自一組的問題。

為了便於存放, 一倍存本身,二倍存食物,三倍存天敵;但我們需要注意:天敵可以吃本身,食物是吃天敵的。

實現**:

1 #include2 #include 3

using

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。那麼對於乙個動物來說,另乙個動物就有了三種情況 同類,天敵以及獵物。很容易可以想到,僅僅是利用普通的並查集已經無法滿足需要了,因為我們有三種情況需要表示。僅僅表示同類可以只用一倍長度的陣列,那麼如果是用三種關係...