資料結構之並查集

2021-07-26 11:14:36 字數 1471 閱讀 3235

覺得很不錯的參考資料引用一下:

陣列實現:合併操作代價高,可達o(n^2).

鍊錶實現:

樹結構實現:查詢與合併的平均時間複雜度為o(log_2⁡n),與樹的深度有關,

優化:降低時間複雜度

按秩合併:若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有...