日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

数据结构---并查集

發(fā)布時間:2024/9/5 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构---并查集 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

并查集,顧名思義,合并 查找 集合;


并查集是一種樹型的數(shù)據(jù)結構,用于處理一些不相交集合(Disjoint Sets)的合并及查詢問題。常常在使用中以森林來表示。

對于概念等等的這里不再贅述,直接講解應用。

應用1:判斷圖中有多少聯(lián)通分量 , 或者圖是否聯(lián)通(聯(lián)通分量 == 1) HDU 1213

應用2:判斷圖是否成環(huán)? 給個例題 HDU2120


【初始化】 MakeSet,將每一個節(jié)點的父節(jié)點置為本身;rank(秩),是節(jié)點構成樹的深度

void MakeSet(){for(int i=1;i<=maxn;i++){parent[i].value = i;parent[i].rank=0;} }


【查找】 一直向上查找,直到找到當前節(jié)點的代表,或者說當前節(jié)點所在樹的根

ps:路徑壓縮,由于查找耗時與樹的深度有關,, 所以我們經(jīng)過一次查找,都把節(jié)點所在樹 壓縮,使之扁平化,這樣樹的深度就大大減小了。

int Findroot(int x){ //路徑壓縮 ?int root=x; ?while(root!=parent[root].value){ ? //找到根節(jié)點root=parent[root].value; ?} ?while(x!=root){ ?int tmp = parent[x].value; ?//將該節(jié)點的父節(jié)點, 以及父節(jié)點的父節(jié)點等等, 全部指向根節(jié)點。parent[x].value = root; ?x=tmp; ?} ?return root; ? }?

【合并】

因為從上面的查找可以看出,查找的效率主要影響因素是樹的深度,也就是秩,所以我們在合并兩顆樹的時候,把秩較小的接在 秩較大的樹的根節(jié)點上

這樣,樹的秩就不會加深,如果 兩棵樹的秩相等,那么深度也只會加1;

void Union(int x,int y){ //按 秩(深度) 合并 , 將秩較小的 接到秩較大的樹的根節(jié)點上int xroot = Find(x);int yroot = Find(y);if(xroot == yroot) return;if(parent[xroot].rank < parent[yroot].rank)parent[xroot].value = yroot;else if(parent[xroot].rank > parent[yroot].rank)parent[yroot].value = xroot;else{parent[yroot].value = xroot; //如果秩相同, 深度會加 1 ; parent[xroot].rank++;} }

轉載于:https://www.cnblogs.com/chaiwenjun000/p/5320985.html

總結

以上是生活随笔為你收集整理的数据结构---并查集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。