演算法總結 並查集

2021-07-29 18:33:58 字數 1305 閱讀 3325

搞了兩年acm,終於準備寫一些部落格了,總得留下點什麼。

不了解並查集的話,推薦這個部落格學習,講的很有意思,當時笑出聲。

下面寫一下自己的理解吧

並查集最簡單的用法,就是把不同的元素歸併到乙個集合裡。

在集合裡選出乙個老大作為代表,集合裡的其他元素都是他的小弟。這樣,就可以判斷任意兩個元素是不是屬於同乙個集合,還可以計算乙個圖中有多少個連通塊。
並查集支援刪點操作
但並不是所有模型都能刪點哦!如果點與點之間的關係是在同一集合或者不在同一集合這種關係,就可以刪點。比如:a-b&&b-c,刪掉點b,a和c還在同一集合。但是,如果點與點的關係是連通與不連通的關係,就不能刪點了。比如 a-b&&b-c,刪掉點b,a和c就不連通了。**總結就是,如果刪完點後會影響其他點之間的關係,這樣就不能刪點**
那麼如何刪點呢
網上的叫法是建立「虛點」,意思就是用乙個陣列把元素指向乙個值,用這個值來代替元素。如:
find(id[a]);//用id[a]來代替a。`
刪除乙個點的操作就是,把元素指向乙個新的值,以前的值就丟棄了。
void delete(a)
怎麼刪除不能刪的點和邊呢
一般做法都是逆向處理詢問,離線處理,刪邊換成加邊,刪點換成加點。
並查集的難點就是處理點與點之間的關係
像線段樹一樣,並查集與能在點上存放&處理資料。**並查集處理的是點與點之間的關係**

比如:*bzoj 1015*

這題要求的是x所在的集合內是否存在value值大於value[x]的點。

在連通兩個點的時候,選擇value值較大的點為根即可。

void

join(int x,int y)

}

*poj 1984*

這裡要求乙個圖中任意兩個點的manhattan距離(這裡簡化一下問題,把manhattan距離改為平面距離,二維降到一維)。

要怎麼求呢?

易知,任意兩個點之間肯定有乙個老大(根結點),那麼記錄每個點與根結點的距離,就可以求得兩個點間的距離了。

但是,老大是會變的!要更新資訊。

int find(int x)

return father[x];

}void join(int x,int y)

}

感覺寫的很差哈,寫部落格好費時間啊

還沒寫完,下次更新吧,爭取用圖來解釋問題。

並查集演算法總結

並查集可以稱之為不相交集合,在處理查詢幾個元素是否在同一集合時使用並查集可以達到非常快的處理速度,並查集的思想有一點很重要,就是利用樹的思想,表示不同的不相交的集合狀態,利用根節點作為代表元素,來對整個集合的資料進行處理。並查集是一種非常精巧而實用的資料結構,主要用於處理一些不相交集合的合併問題,一...

並查集演算法總結

public class unionfind public int getcount public boolean isconnected int p,int q public int find int p public void union int p,int q public class uni...

並查集和帶權並查集(演算法總結)

並查集 what 並查集是一種用來管理元素分組情況的資料結構。作用 1.查詢元素a,b是否屬於同一組。2.合併元素a,b所在的組。結構 樹形,不是二叉樹。注意 防止樹形結構發生退化,將所有元素找到她的根節點,讓其父結點,直接為他的根節點,方便查詢。並查集模板 1.查詢 1 遞迴模式 複雜度高,不建議...