帶權並查集 深度理解

2021-09-19 09:52:03 字數 1179 閱讀 2284

我們都知道乙個點的權值,是這個節點到根節點之間的差值,我們根據差值,就可以知道很多東西,權值陣列sum[maxn]

1.已知兩個點的權值(假設都是與根節點的權值),那麼這個兩個點的差值為   sum[x]-sum[y]=(fen[x]-u)-(fen[y]-u)=fen[x]-fen[y] 就是參考點變換了一下,就可以間接找出這兩個節點之間的差值。

2.在合併兩個點時,  我們已經知道了,這個權值就是這個點與根節點之間的差值。我們可以根據這個關係,在合併集合的時候,找出兩個集合的根節點之間的差值。

我們現在假設定義 pre[fy]=fx 就是將fy連到fx上,我們 就定義fy 比 fx 高多少x(或者高 -x ),然後pre[fx]=fy 就是fx 比fy 高什麼。我們都先定義乙個方向,在後面好理解 權值之間來回的關係。上面 第一條已經說了,權值就是將參照點變了一下,我們 通常x比y高,也可以間接的來說,x先比a高 10分,a又比b高10分,b又比c高 10分 ,c又比y高10分,現在我們定義乙個方向向量,由x直接到y的那個向量就是由x到a再到b再到c最後再到y,那麼這個值全加上,就是x直接與y之間的 差值(就是權值40),我們可以利用這個性質,可以來理解帶權並查集中的難點。

就是下面這個地方容易搞混,其實將方向向量加入到這個思考中,就會想的簡單一點,我們現在已經都設定了方向,由px->py ,就是px比py 高多少,py->px 就是py比px 高多少(也是權值之間的差值),所以下面這些式子都是根據在這個方向的確立之上的,由x直接到px ,等價於由x間接到y->py->px,這樣將中間步驟的差值都加上去,就可以找出 px->py 之間差值,或者py->px 之間差值。

}//不管上面是誰指向誰,下面求出這個a,b之間差值都是這樣求得,不用改變。畢竟我們已經指定 a->b了。

scanf("%d%d",&a,&b);

int fa=find(a);

int fb=find(b);

if(fa!=fb)

cout<

在hihocoder - 1515  

hdu - 3047

hdu - 3038

都會涉及這個應用,是很重要的乙個結論吧。

並查集,帶權並查集

題意 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...

帶權並查集 then

問題 b 便 時間限制 2 sec 記憶體限制 512 mb 提交 50 解決 14 題目描述 給出乙個r c的棋盤.共有r行c列,r c個格仔.現要在每個格仔都填乙個非負整數.使得任意乙個2 2的正方形區域都滿足這樣的性質 左上角的數字 右下角的數字 左下角的數字 右上角的數字.有些格仔已經確定,...