並查集,用於判斷一對元素之間是否相連,他們之間是否相連是動態新增的,這一類問題叫做動態連通性問題。主要執行的操作是
1、合併
2、判斷是否處於同乙個集合中
並查集使用雜湊表或者陣列實現,儲存的元素用於表示 當前結點 指向的 根結點,初始化的時候根結點指向自己。
合併操作就是把 乙個集合的根結點指向另乙個集合的根結點,兩個元素的根結點一樣則代表元素 處於同乙個集合之中。
這種表示 不相交集合的方法稱之為代表元法,每個結點的根結點作為乙個集合的代表元
並查集:最常見的使用就是kruskal最小生成樹演算法。也就意味著你首先要知道你的頂點的個數
並查集常見的優化方案
1、路徑壓縮(隔代壓縮、完全壓縮)
2、按秩合併
下面展示一道經典並查集例題
輸入:[「a==b」,「b!=a」]
輸出:false
解釋:如果我們指定,a = 1 且 b = 1,那麼可以滿足第乙個方程,但無法滿足第二個方程。沒有辦法分配變數同時滿足這兩個方程。
以下**是leetcode官方題解,我只是加上了個人注釋方便理解
class solution
//2、遍歷 進行等價合併操作
for(string s:equations)
}//3、對比 驗證是否存在矛盾
for(string s:equations)
}return true;
}//合併
public void union(int parents,int index1,int index2)
//查詢根結點, 並進行路徑壓縮(這裡採用的完全壓縮)
//根結點 陣列下標必對應陣列元素
public int find(int parents,int index)
return index;
}}
leetcode 990 等式方程 (6 8刷題)
思路 相等的關係可以傳遞,最終的結果集必然是若干個集合,每個集合裡的變數擁有相同的值,即處在同乙個連通分量裡。而不等關係則是兩個變數在不同的連通分量裡。所以,先針對相等關係建立並查集,而後判斷每個不等關係是否都滿足即可。class solution return t public void unio...
並查集 並查集
本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...
LeetCode 990 等式方程的可滿足性 中等
給定乙個由表示變數之間關係的字串方程組成的陣列,每個字串方程 equations i 的長度為 4,並採用兩種不同的形式之一 a b 或 a b 在這裡,a 和 b 是小寫字母 不一定不同 表示單字母變數名。只有當可以將整數分配給變數名,以便滿足所有給定的方程時才返回 true,否則返回 false...