帶權並查集種類並查集

2021-08-20 06:51:36 字數 2259 閱讀 6469

帶權並查集

種類並查集

例題:種類並查集 洛谷 p2024 食物鏈

與普通並查集不同是新增加屬性:

group[i]:group[i]表示它和fa[i]的關係,對於這三種種類,同類可以用

0表示,其他兩種分別用

1表示該結點被父節點吃,

2表示該節點吃父節點。

舉個例子:現在有

pa[3] = 4; group[3] = 1;

這裡的group3]

僅僅代表3和

4屬於屬於不同的集團!!!!!(非常重要)

操作:

1.find

函式:

每次find

的時候更新它屬於哪個

num,

因為他之前的父親的父親已經是根節點了,

所以可以利用它之前的父親和它

和之前父親的關係更新它和根節點的關係,當然更新後的

num還是和父親的關係;

不過父親已經變成了根節點了;

find

的**:

int find(int x)

2.unios_set

函式:

當然這個也要看題,

不過大同小異;

**中的變數解釋:

fx: x

的根節點,fy:

y的根節點;

group[x]: x和它父親的關係(重要)

type:指傳入的x和y是什麼關係, 1代表他們是同類, 2代表x吃y(和例題目中是一樣的);

pa[x]代表x

的父親;

**解釋:

if(fx ==fy)

表示他們屬於同乙個集合,因為x

和y已經find

過了,所以他們的

group

都是和根節點的關係(當然他們的根節點是一樣的因為

fx = fy)

這個時候只需要看滿不滿足

type就ok

了;如果他們不是同乙個集合,

就鏈結兩個集合;

如果你不是很熟悉,

可以把所有的情況的考慮一下;

這裡提一下,

group[fx] = grou[fy] = 0;

因為他們沒有父親,

而我們初始化的時候都初始化成0的;

比如y和x

是同乙個

group 1.type == 1

那麼fx和fy

同一類;group[fx] 不變為

0; 2.type ==2

因為我們會更新

pa[fx]= fy; type == 2 說明x

吃y本來x

和y的group

是一樣的,

所以只要把x的

group+1就ok

了,因為x的

group加了1

,所以該集合中的所有元素的

group

必定也+1

(他們是一體的)

所以不必更新

group[x]

只需要更新

group[fx] += 1

(因為它的

group = 0,

所以直接等於

1頁可以)就

ok了,

這樣就實現了該集合的所有元素的

group

都更新了

(因為在

find

函式的時候會更新

group

)你可以再考慮一下

group[y] - grou[x] = 1

後者2

或者-1

或者-2

;就會發現他們可以用乙個式子滿足

group[fx]= (group[y] - group[x] + 3 + (type - 1)) % 3;

union_set

函式的**:

boolunion_set(int type, int x, int y) 

group[fx]= (group[y] - group[x] + 3 + (type - 1)) % 3;

pa[fx] =fy;

returnfalse;

}

種類並查集 帶權並查集

p2024 noi2001 食物鏈 題目描述 動物王國中有三類動物 a,b,c,這三類動物的食物鏈構成了有趣的環形。a 吃 b,b 吃 c,c 吃 a。現有 n 個動物,以 1 n 編號。每個動物都是 a,b,c 中的一種,但是我們並不知道 它到底是哪一種。有人用兩種說法對這 n 個動物所構成的食物...

並查集,帶權並查集

題意 ignatius過生日,客人來到,他想知道他需要準備多少張桌子。然而一張桌子上面只能坐上相互熟悉的人,其中熟悉可定義成為a與b認識,b與c認識,我們就說a,b,c相互熟悉 例如a與b熟悉and b與c熟悉,d與e熟悉,此時至少需要兩張桌子。輸入 t表示樣例個數,n表示朋友個數,朋友從1到n編號...

並查集 帶權並查集 種類並查集 入門基礎題

include include include include include include include includetypedef long long ll using namespace std const int inf 0x3f3f3f3f const int maxn 2e5 10...