我的部落格原文:用集合中的某個元素來代表這個集合,,該元素稱之為集合的代表元
每個集合可以理解為乙個樹,對於集合中的每個元素(如x),都有乙個值(如parent[x])指向其在結構上的父節點。如果x為集合的代表元,即根節點,則令parent[x]=x;
對於查詢操作,假設需要確定x所在的的集合,也就是確定集合的代表元。可以沿著parent[x]不斷在樹形結構中向上移動,直到到達根節點。
判斷兩個元素是否屬於同一集合,只需要看他們的代表元是否相同即可。包括對所有單個的資料建立乙個單獨的集合(即根據題目的意思自己建立的最多可能有的集合,為下面的合併查詢操作提供操作物件)
結構體表示法
#define max 10000
struct node
node[max];
// 初始化i集合的函式
void init(int i)
陣列表示法int parent[max];
int rank[max];
int data[max];
void init(int i)
結構體/**
*查詢集合i(乙個元素是乙個集合)的源頭(遞迴實現)。
如果集合i的父親是自己,說明自己就是源頭,返回自己的標號;
否則查詢集合i的父親的源頭。
**/int get_parent(int x)
陣列// 查詢集合i(乙個元素是乙個集合)的源頭(遞迴實現)
int find_set(int i)
// 查詢的同時進行集合的優化的函式(減少樹的高度)
int unifind(int a)
// compress the path
while( a != root)
return root;
}
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-geb8dz4y-1595032422862)(
talk is cheep,show the code.結構體
void union(int a,int b)
}
陣列void union(int i,int j)
}
計算最後有多少元素父元素仍然為自己parent[x]==x,就算出有多少個不相交的集合
// 這裡只放結構體的函式了
int count(int i)
}return c;
}
acm典型例題:acm_hdu_1213
傻子都能看懂的並查集入門-ocean
ACM入門(1) 資料結構 並查集
acm入門 1 資料結構 並查集 並查集 一 檢索某元素屬於哪個集合 find 函式 二 合併兩個集合 union 函式 能夠查詢某個元素屬於哪個集合 即 查 同時能夠實現集合的合併 即 並 這樣的資料結構,我們稱之為並查集。並查集的實現 c c define max size 元素個數 int p...
並查集入門
簡述 其實並查集顧名思義就是有 合併集合 和 查詢集合 兩種操作的關於資料結構的一種演算法。並查集演算法不支援分割乙個集合。演算法 用集合中的某個元素來代表這個集合,該元素稱為集合的代表元。乙個集合內的所有元素組織成以代表元為根的樹形結構。對於每乙個元素 parent x 指向x在樹形結構上的父親節...
並查集入門
1.並查集是一種樹形的資料結構,顧名思義,它用於處理一些不交集的合併及查詢問題。它支援兩種操作 查詢 find 確定某個元素處於哪個子集 合併 union 將兩個子集合並成乙個集合。初始化 void makeset int size 查詢 int find int x 合併 void unionse...