今天聽隊友講課講了並查集,好像比去年聽的時候更明白了一些。同時,知道了除了普通並查集,還有種類並查集和帶權並查集等。對於種類並查集的建模能力還有待提高,帶權並查集可能又得下乙個階段才能學習了。
三個重要函式
void init(int n)
int find(int x)
void union(int x, int y)
強調!!由於並查集的題往往資料範圍較大,且find()函式遞迴呼叫。故不宜使用cin,而應直接使用scanf.
no.1
hdu 1213 how many talbes
並查集模板題,套板子即可。
no.2
hdu 1272 小希的迷宮
判斷是否是乙個集合,且沒有環
題解:在合併時如果x, y的根結點相等,說明存在環。在最後遍歷一遍,若i == f[i]的個數大於1, 說明不止乙個集合。
no.3
hdu 1232 暢通工程
並查集模板題,套板子即可。
no.4
hdu 1856 more is better
在普通並查集的基礎上,求合併次數最多項。
題解:另設一t陣列,初始都為1。每次合併時,若使f[fy] = fx;則t[fx] += t[fy];
no.5
poj 1611 病毒傳染
在普通並查集的基礎上,要求每次合併時都以root為根節點。使用union(root, x)即可。
no.6
poj 2524 ubiquitous religions
並查集模板題,套板子即可。
帶權並查集
帶權並查集的特點是每個結點還儲存著一定的資訊,如到跟結點的距離,轉移次數等。解決此類問題,就另設儲存資訊的陣列,在每次轉移時,資訊也隨之轉移。注意,要先遞迴,再轉移資訊。遇到矛盾衝突問題,解決的關鍵是找到矛盾點,可通過畫向量找關係式來解決。
no.7
hdu 3047 zjnu stadium
帶權並查集
尋找座位安排的矛盾,轉化成每個點到根結點的距離問題。帶權並查集模板題。
no.8
hdu 3172 virtual friends
帶權並查集+map
將所給字串先對應轉換成數字,再用並查集模板,同時需另設一陣列t,表示轉移次數。
no.9
hdu 3635 dragon balls
帶權並查集
每個龍珠屬於乙個城市,當城市之間轉移時,該城市所有龍珠都需轉移。查詢龍珠所在城市,該城市龍珠個數,以及轉移次數。
題解:在普通並查集的基礎上,另設一陣列t,表示轉移次數,在合併時自增。另設一陣列num,表示每座城市龍珠數量,在合併時將孩子的龍珠數量增加過來。父親的轉移次數,需在find()時加上孩子的轉移次數。
注意!!!find()中,先遞迴迴圈,再t[x] += t[f[x]];否則會產生時序錯誤。
種類並查集
種類並查集在使用三個函式時,無需變化。開陣列時,有幾種,就開幾倍,在初始化時,引數也應為k * n。
在合併時,若為同種,則合併(x,y), (x + n, y + n), … ,(x + k * n, y + k * n);
若為異種,則合併(x, y + n), (x + n, y + 2 * n), … , (x + k * n, y)
在查詢時,則指查詢一種即可(由於合併時已同步操作)。
no.10
hdu 1829 a bug』s life
種類並查集
需要自己建模,抽象出為兩種,接著套用種類並查集的模板。
no.11
poj 1703 find them, catch them
種類並查集,犯人分為兩個監獄,查詢兩人是否在同一監獄,抽象出種類有兩種,接著套用板子。
no.12
poj 1182 食物鏈
種類並查集經典題,a吃b,b吃c,c吃a,三種關係,種類有三種,接著套用板子。
qbzt寒假 並查集
並查集 kruscal tarjan 求 lca 分類並查集 食物鏈,團夥 敵人的敵人是我的朋友 帶權並查集 sdoi2016 齒輪 可用 int father int x 建邊 任意相鄰兩格仔之間建邊,權值為海拔差 將邊排序,從小往大乙個乙個往裡加,當乙個並查集內部有起點,並且大小 點數 t,這裡...
演算法訓練 並查集
這個是我做 kuangbin帶你飛專題訓練的第三個專題,對應的是 kuangbin帶你飛專題五,這個專題是並查集專題,包含14道題目。並查集屬於樹形結構,是一種用來管理元素分組情況的資料結構。並查集可以高效的進行如下操作 值得注意的是,並查集雖然可以進行合併操作,但是不能進行分割操作。當然了這並不意...
2020 寒假私訓 並查集
並查集的原理很簡單 在下標對應的陣列中寫入當前下標的父節點,說明當前節點和父節點有羈絆,無數個子節點連線著乙個父節點,如果要想判斷兩個節點之間是否有羈絆,只需對一對他們的父輩 根節點 就行了。並查集一般用於查詢圖中節點之間的關係。並查集演算法一般包括3大部分 find 函式用來確定某節點x1的父親節...