並查集之旅

2021-10-02 09:43:41 字數 2266 閱讀 7453

最基礎的並查集。

#include

using

namespace std;

int s[

50005

], hight[

50005];

void

init

(int n)

}int

getroot

(int x)

void

merge

(int x,

int y)

else

}int

main()

for(

int i =

1; i <= n; i++

) cout <<

"case "

<<

++tmp <<

": "

; cout << ans << endl;

}return0;

}

類似於並查集的連通問題。

#include

using

namespace std;

int s[

30005

], sum[

30005];

//sum用來記錄當前集合的元素個數,s為並查集

void

init

(int n)

//初始話

}int

getroot

(int x)

//壓縮狀態

intmerge

(int x,

int y)

//集合的交

}int

main()

} cout << sum[

getroot(0

)]<< endl;

}return0;

}

並查集提高題,並查集維護不同集合的關係。

#include

using

namespace std;

const

int maxn =

(1e5+5

)*2;

int s[maxn]

, high[maxn]

;//存根

void

itin

(int n)

//初始化

}int

getroot

(int x)

//壓縮狀態

void

merge

(int x,

int y)

//合併優化

else

}bool

same

(int x,

int y)

//判斷函式

intmain()

else

//merge}}

return0;

}

與座標有關的並查集。

處理方法,結構體存放座標,其他與普通並查集相同。

#include

#include

using

namespace std;

int s[

1005

], high[

1005];

struct zb

num[

1005];

doublefx(

int x1,

int y1,

int x2,

int y2)

intfind_set

(int x)

bool

some

(int x,

int y)

//check

void

union_set

(int x,

int y)

//merge

else

if(high[x]

> high[y]

) s[y]

= x;

else

s[x]

= y;

}int

main()

int t1, t2;

while

(cin >> ch)

}else

//檢查結構體

}return0;

}

並查集 並查集

本文參考了 挑戰程式設計競賽 和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 ...

並查集入門(普通並查集 帶刪除並查集 關係並查集)

什麼是並查集?通俗易懂的並查集詳解 普通並查集 基礎並查集 例題 題解 how many tables problem description lh boy無聊的時候很喜歡數螞蟻,而且,還給每乙隻小螞蟻編號,通過他長期的觀察和記錄,發現編號為i的螞蟻會和編號為j的螞蟻在一起。現在問題來了,他現在只有...

並查集,帶權並查集

題意 ignatius過生日,客人來到,他想知道他需要準備多少張桌子。然而一張桌子上面只能坐上相互熟悉的人,其中熟悉可定義成為a與b認識,b與c認識,我們就說a,b,c相互熟悉 例如a與b熟悉and b與c熟悉,d與e熟悉,此時至少需要兩張桌子。輸入 t表示樣例個數,n表示朋友個數,朋友從1到n編號...