帶(加)權並查集 演算法學習

2021-09-19 10:19:04 字數 1055 閱讀 5543

相比於簡單的並查集,帶權並查集中各個節點之間的關係更為複雜。

帶(加)權並查集的實現同簡單並查集並沒有什麼不用,但是帶(加)權並查集的關係合併操作中會比多用到模除或者是異或操作,具體因題而異。

解析:本題作為帶(加)權並查集經典題目,**中的合併操作在主函式中完成了。而且通過向量思維的解釋,該題的邏輯也更容易理解。

向量思維:

1.若rootx與rooty不同,則:

rootx->rooty = rootx->x + x->y + y->rooty

即rootx->rooty = (relation[x]+d-1+3-relation[y])%3 = relation[rooty]

2.如果rootx和rooty相同,則:

x->y = x->rootx + rootx->y

即x->y = (3-relation[x]+relation[y])%3

下面直接上**:

#include

#include

using

namespace std;

const

int n=

50000

;struct node ani[n+5]

;int n,k;

void

ufinit()

}int

find

(int a)

intmain()

if(d==

2&&x==y)

//條件三

int rootx=

find

(x);

int rooty=

find

(y);

//向量法中,ani[x].re表示rootx~x

//根據ani[x].re可反向推出x~rootx的關係,即(3-ani[x].re)

if(rootx!=rooty)

//合併

else

}printf

("%d\n"

,ans)

;return0;

}

演算法學習 並查集

大家肯定有聽說過社交網路裡面的六人理論吧,說是可以通過六個人的聯絡認識世界上的任意乙個人。比如我想認識一下機械系的系花,我先找到機械系的朋友,然後通過朋友介紹認識。這樣可以發現我們的社交圈子其實是有部分重疊的。當然也有可能是我的圈子太小,根本沒有什麼朋友認識那個圈子裡面的人,也有很大可能是機械系花4...

演算法學習之並查集

並查集是一種樹型的結構,常常用來處理一些不相交的集合的合併和查詢問題。查詢 確定元素所在的集合。合併 將兩個集合合併成乙個集合。查詢v所在集合的根節點 int find int v 合併 void merge int x,int y 優化1 int find int x k x while k r ...

演算法學習之 並查集

並查集用於解決連線類問題,判斷網路中節點間的連線狀態。與路徑類問題相比,並查集只回答了節點之間是否連通,而具體的連通路徑並不能確定,因此並查集在某些場景下非常高效。如前所述,此處的並查集實現只提供兩個介面 是否連線,元素合併。下面 使用乙個陣列來記錄每個元素所對應的類別,如果兩個元素的類別相同,則稱...