poj1182 食物鏈(帶權並查集)

2022-09-15 23:30:29 字數 762 閱讀 8235

題目鏈結

思路

前面做的帶權並查集的權值記錄該結點與其父結點是否是同一類,只有兩種取值情況(0,1),在這題中某結點a和其父結點b的取值共有三種情況:a和b同類;a被b吃;a**,對應三種情況,r[a]的取值分別為0,1,2。這題的難點是遞推公式,路徑壓縮遞推公式為r[x] = (r[x] + r[t]) % 3,合併集合遞推公式為r[ra] = (3 - r[a] + d - 1 + r[b]) % 3,遞推公式形式的推導可以參考這篇文章。

**

1 #include 2

3const

int n = 500000 + 10;4

intp[n];

5int

r[n];67

void make_set(intn)8

14}1516

int find_root(int

x)17

2627

int union_set(int d, int a, int

b)28

38else

3944

return0;

45}4647

intmain()

4862 printf("

%d\n

", ans);

63return0;

64 }

參考:

1、2、

poj 1182 食物鏈 帶權並查集

這個題需要將動物分成3種,每次以y 0為物件,吃他的x為1,需要注意的是下一次碰到x cha函式遞迴更新與x有關的物件 include include include includeusing namespace std define n 50005 int father n num n int c...

poj1182食物鏈 帶權並查集

基本思路 帶權並查集 簡單的理解就是將有關係的點合併到乙個集合,記錄每個點到集合根節點的權重 include include include define max 50010 using namespace std int par max 記錄集合根節點 int offset max 記錄每個節點到...

poj 1182 食物鏈 帶權並查集

食物鏈 time limit 1000ms memory limit 10000k total submissions 50713 accepted 14818 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n...