思路:種類並查集,搗鼓搗鼓把題a了,但是沒咋懂,列入學習清單,參考了這篇部落格和這篇部落格
**:
1//#include
2 #include3 #include4 #include5 #include
6 #include7 #include8 #include9 #include10 #include
11 #include12
#define inf 0x3f3f3f3f
13using
namespace
std;
14 typedef long
long
ll;15
const
int m = int(1e5) * 3 + 5;16
struct
node
17root[m];
21void init(int
n)2228}
29int find(int
x)30
36return root[x].id;
*/37
if (x == root[x].id) return
x;38
int temp =root[x].id;
39 root[x].id =find(temp);
40 root[x].re = (root[x].re + root[temp].re) % 3;41
return
root[x].id;42}
43//
void merge(int x, int y)
44//
49signed main()
5064
if (op == 2 && x ==y)
6569
int xx =find(x);
70int yy =find(y);
71if (xx !=yy)
7276
else
7783
if (op == 2 && (3 - root[x].re + root[y].re) % 3 != op - 1)84
88}89}
90 cout << sum <91return0;
92 }
備註:關鍵是關係域的更新的公式,用向量的方式去思考會更好理解一點
洛谷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。那麼對於乙個動物來說,另乙個動物就有了三種情況 同類,天敵以及獵物。很容易可以想到,僅僅是利用普通的並查集已經無法滿足需要了,因為我們有三種情況需要表示。僅僅表示同類可以只用一倍長度的陣列,那麼如果是用三種關係...
P2024 NOI2001 食物鏈(洛谷)
題目傳送門 核心解法 並查集 關鍵要理清楚這些關係是怎樣的 即通過了解題意可知 假設現在有如下三種動物型別 老虎,老虎的食物,老虎的天敵。所輸入的x y都只滿足這三種型別 輸入m次去判斷關係 x y是兩個獨立的未知種類的動物 即不知道是老虎本體 食物還是天敵 現在需要通過構建且查詢個體間的關係,因此...