覺得很不錯的參考資料引用一下:
陣列實現:合併操作代價高,可達o(n^2).
鍊錶實現:
樹結構實現:查詢與合併的平均時間複雜度為o(log_2n),與樹的深度有關,
優化:降低時間複雜度
按秩合併:若h_b>h_b,則將b樹作為a樹的子樹。
帶路徑壓縮的查詢演算法:改變結點所指方向以減小深度,查詢路徑時「走兩遍」,第一遍找到根結點,第二遍讓路徑上的點指向根結點。
solved :
hdu1856 more is better
hdu1272 小希的迷宮
#include
#define max(a,b) ((a)>(b)?(a):(b))
#define max 100010
int p[max],num[max],visit[max];
int large = 0,mark,enum;
int findx(int
x)void union(int
x,int
y) fx = findx(x);
fy = findx(y);
if(fx != fy)
else mark = 0;
}int main()
mark = 1;
large = 0;
vernum = 0;
enum = 0;
for(i = 1; i<=max; i++)
visit[x] = 1;
visit[y] = 1;
union(x,y);
while(scanf("%d
%d",&x,&y) && x!=0 && y!=0)
for(i = 1; i<=large; i++)
if(visit[i]==1)
vernum++;
if(mark==1 && vernum-1 == enum)
printf("yes\n");
else
printf("no\n");
}}
hdu1213 how many tables
#include
#define max(a,b) ((a)>(b)?(a):(b))
#define max 100010
int p[max];
int mark;
int findx(int
x)void union(int
x,inty)}
int main()
mark = 0;
while(m--)
for(int i=1;i<=n;i++)
if(p[i]==i)
mark++;
printf("%d\n",mark);
}//while t
}}
資料結構之並查集
並查集 union find sets 是一種簡單的用途廣泛的集合.並查集是若干個不相交集合,能夠實現較快的合併和判斷元素所在集合的操作,應用很多,如其求無向圖的連通分量個數 最小公共祖先 帶限制的作業排序,還有最完美的應用 實現kruskar演算法求最小生成樹。其實,這一部分 演算法導論 講的很精...
資料結構之並查集
1.將兩個集合合併。2.詢問兩個元素是否在乙個集合當中。複雜度近乎o 1 基本原理 每個集合用一棵樹來表示。樹根的編號就是整個集合的編號。每個節點儲存它的父節點,p x 表示x的父節點。問題1 如何判斷樹根 if p x x 問題2 如何求x的集合編號 while p x x x p x 問題3 如...
資料結構之並查集
並查集是一種用來管理元素分組情況的資料結構。並查集可以高效地進行如下操作。不過需要注意並查集雖然可以進行合併操作,但是卻無法進行分割操作。n個城市中 編號1 n 有一些城市間會有無向的通路。現在小明想從a城市到b城市,判斷是否能實現?即a和b是否有直接或間接的道路連通起來。如有4個城市,其中1和2有...