假設以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...