所謂並查集,就是集合,對集合的操作分為兩種:並和查。
下面有兩種實現。
第一種是不進行任何改善的。
第二種是進行改善的。
#include
#include
typedef
int elemnttype;
//採用陣列儲存方式,根的parent為-1.
typedef
struct
settype;
//find
int find(settype s, elemnttype x)
void union(settype s, elementtype x1, elemnttype x2)
#include
#include
using
namespace
std;
#define maxn 1000 /* 集合最大元素個數 */
typedef
int elementtype; /* 預設元素可以用非負整數表示 */
typedef
int setname; /* 預設用根結點的下標作為集合名稱 */
typedef elementtype settype[maxn]; /* 假設集合元素下標從0開始 */
/*按秩歸併,前者是按照規模,後者按照樹高,建議用前者,因為路徑壓縮的時候樹高會發生變化,而進行
路徑壓縮的時候並沒有修改樹高*/
void union(settype s, setname root1, setname root2 ) //s[root]=-元素數
else
}void union(settype s, setname root1, setname root2)//s[root]=-樹高
}setname find(settype s, elementtype x )
//非遞迴查詢
int find(int x)
return r;
}
並查集知識
其實並查集顧名思義就是有 合併集合 和 查詢集合 兩種操作的關於資料結構的一種演算法。並查集演算法不支援分割乙個集合。用集合中的某個元素來代表這個集合,該元素稱為集合的代表元。乙個集合內的所有元素組織成以代表元為根的樹形結構。對於每乙個元素 parent x 指向x在樹形結構上的父親節點。如果x是根...
並查集基礎
並查集問題描述 在一些有n個元素的集合應用問題中,我們通常是在開始時讓每個元素構成乙個單元素的集合,然後按一定順序將屬於同一組的元素所在的集合合併,其間要反覆查詢乙個元素在哪個集合中。這一類問題近幾年來反覆出現在資訊學的國際國內賽題中,其特點是看似並不複雜,但資料量極大,若用正常的資料結構來描述的話...
並查集基礎
並查集的原理 實現與應用 什麼是並查集 如果給出各個元素之間的聯絡,要求將這些元素分成幾個集合,每個集合中的元素直接或間接有聯絡。在這類問題中主要涉及的是對集合的合併和查詢,因此將這種集合稱為並查集。什麼是等價類 在並查集中,同乙個集合中的元素直接或者間接地有聯絡,我們就把這些元素稱為屬於同乙個等價...