並查集詳解

2021-08-25 11:02:25 字數 1244 閱讀 5346

看大佬的形象解釋:

//並查集

按我現在對這個的理解:

就是給你一堆數,然後給你兩個兩個數的關係,然後關係的傳遞性(連帶性),這些數就都有了關係

有關係的數組成乙個陣列,然後輸出這個一維陣列,裡面有幾個沒關係的陣列

應該怎麼做呢?

第一種解釋是:

每給兩個數就把乙個數當成祖宗,把另乙個數當成孩子,然後給了孩子和另外乙個人有關係之後,這個孩子的祖宗就成了這個人的祖宗,

之後就是祖宗一樣的放在一起,然後有幾個祖宗不一樣的,就有幾個不同的集合

#includeconst int maxn = 10000;

int f[maxn];

/迴圈方法求祖宗

int getfather(int v)

return v;

}//遞迴方法求祖宗

int getfather2(int v)

}//遞迴,判斷求祖宗

int getfather3(int v)

//讓有關係的合併

void unions(int x,int y)

int main()

for(int i=1;i<=m;i++)

int sum=0;

for(int i=1;i<=n;i++) f[i] = getfather(f[i]);//收縮一下,讓關係直接指向祖宗

for(int i=1;i<=n;i++)

printf("%d",sum);//輸出有幾個不一樣的集合

return 0;

}

如果你上面的看不懂,那也沒關係,下面讓我用另一種關係說明;

武俠**版,這個是我引用別人的想法,並把他的想法吸收,最後用自己的語言表達出來,融會貫通,一氣呵成,

#includeusing namespace std;

int f[10000];

//找到自己的掌門(最上級) 

void find(int x)

//合併他們(你指定讓誰和誰是乙個門派的) 

void join(int x,int y)

int main()

int sum=0;

for(int i=1;i<=n;i++)

f[i]=find(i);//這部的作用就是讓所有人的直系關係都變成掌門 

for(int i=1;i<=n;i++) 

cout

}

並查集詳解

其實並查集顧名思義就是有 合併集合 和 查詢集合 兩種操作的關於資料結構的一種演算法。並查集演算法不支援分割乙個集合。用集合中的某個元素來代表這個集合,該元素稱為集合的代表元。乙個集合內的所有元素組織成以代表元為根的樹形結構。對於每乙個元素 parent x 指向x在樹形結構上的父親節點。如果x是根...

詳解並查集

並查集主要用來求解不相交集合的問題,主要針對於合併和查詢兩種演算法。並查集的實現主要包含了三個部分 並查集的初始化是對單個資料建立了乙個單獨的集合,每個集合應該包含以下兩個資料 由以上兩個資料,一般的並查集的結構一般有兩種表示形式 結構體構造如下 define max 50 struct node ...

並查集詳解

並查集是一種樹型的高階資料結構,主要用於處理不相交集合的合併及查詢問題。它在電腦科學中有著廣泛的應用,例如求解最小生成樹 親戚關係的判定 確定無向圖的連通子圖個數 最小公共祖先問題等,都要用到並查集。集合是數學中最基本的構造之一,將一組滿足某種性質的物件放在一起就形成了集合。集合中包含的物件稱為集合...