支配樹模板(帶權並查集版本)

2021-09-26 22:21:56 字數 1532 閱讀 1245

假設以1是起點。

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

2e5+7;

const

int maxm=

8e5+7;

vector<

int> dom[maxn]

;//x支配的點集;

struct edgeedge[maxm]

;//正向圖,反向圖,支配樹;

int headg[maxn]

,headrg[maxn]

,top,headd[maxn]

;//父親,時間戳,時間戳,時間戳對應的節點;

int fa[maxn]

, dfn[maxn]

, clk, rdfn[maxn]

;int fre[maxn]

, best[maxn]

, semi[maxn]

, idom[maxn]

;// 並查集,並查集路徑權值,記錄從節點x到首節點路徑上的所有節點中半必經點dfs序最小的節點,最遠半必經點,最近必經點;

void

init

(int n)

void

add(

int u,

int v,

int head)

//求dfs序;

void

dfs(

int u)}}

//路徑壓縮;

intfix

(int x)

voidgo(

int rt)

fre[x]

=fa[x]

; dom[ semi[x]

=rdfn[mn]].

push_back

(x);

x=rdfn[i-1]

;for

(int j=

0;j.size()

;++j)

dom[x]

.clear()

;}for(

int i=

2;i<=clk;

++i)

}int siz[maxn]

;bool vis[maxn]

;void

dfs2

(int x)

}int

main()

go(1)

;for

(int i=

1;i<=n;

++i)

if(idom[i]

)add

(idom[i]

,i,headd)

;dfs2(1

);for(

int i=

1;i<=n;

++i)

printf

("%d "

,siz[i]);

return0;

}

並查集模板 帶權並查集

並查集由乙個整數型的陣列和兩個函式構成。陣列pre 記錄了每個點的前導點是什麼,函式find是查詢,join是合併。int pre 1005 intfind int x 查詢x的前乙個節點 最終r為根節點 路徑壓縮 把所有子節點的上乙個節點都改為根節點 int i x,j while i r ret...

並查集,帶權並查集

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

帶權並查集

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