1.非路徑壓縮:
遞迴版:
__int64 findroot(__int64 x)
非遞迴版:
__int64 findroot(__int64 x)//查詢x的根節點
2.帶路徑壓縮:
遞迴版:
__int64 findroot(__int64 x)//找x的根節點
非遞迴版:
__int64 findroot(__int64 x)
return r;
}
還可根據題意對此函式進行修改使其實現其他的功能 如:記錄x的父節點有多少個.
3.合併函式:
void union(__int64 x,__int64 y)
}
注意:區分是合併乙個節點到乙個樹上還是合併兩棵樹;
查詢根節點時用不用路徑壓縮:一般來說有向圖不用壓縮,具體判斷還應結合時間複雜度.
詳細講解:
並查集知識
其實並查集顧名思義就是有 合併集合 和 查詢集合 兩種操作的關於資料結構的一種演算法。並查集演算法不支援分割乙個集合。用集合中的某個元素來代表這個集合,該元素稱為集合的代表元。乙個集合內的所有元素組織成以代表元為根的樹形結構。對於每乙個元素 parent x 指向x在樹形結構上的父親節點。如果x是根...
並查集 總結
自己學完後總結一下吧,並查集,我的理解就是乙個查詢與合併,用乙個find函式來查詢自己的祖先也就是根節點,在這過程中還可以進行路徑壓縮,就是讓這個點直接變到根節點之下,還有就是合併,找出這兩個點的根節點,如果根節點不相同的話,就將乙個根節點放到另乙個根節點下面。這道題的就是用並查集做,找出總共有幾個...
並查集總結
用自己的理解來寫好了 有些地方可能不對 不定時更新理解 操作主要為三步 一 初始化 void init 二 查詢 這個為路徑壓縮 就是每次查詢時更新 查詢節點 x 上面所有節點直接使他們連向根節點 每次查詢更新 int find int x 另一種路徑壓縮 不過麻煩了些 作為理解 int find ...