南昌理工學院acm集訓隊
超級有意思的並查集解釋
也不知道是哪位大神寫出來的,多看幾遍就懂了。
我感覺我寫不出來比這更好的並查集解釋了,還很有趣。
那理解了並查集就來看一下例題吧
洛谷p1111 修復公路
直接上**了
#include
#include
#include
#include
#include
const
int max=
100000
;using
namespace std;
typedef
long
long ll;
//洛谷p1111 修復公路
//並查集 快速排序
int par[
1001];
struct tnode g[
100001];
bool
cmp(tnode i,tnode j)
intfind
(int x)
return r;
}int sum=1;
void
join
(int x,
int y)
}int
main()
for(
int i=
0;i )sort
(g,g+m,cmp)
;//快排
for(
int i=
0;i cout<<
"-1"
}
除了加上了乙個結構快排外其他的都是並查集的模板了
當然,在平時做題的時候,光知道模板肯定是不夠的,還是需要多加練習去真正掌握
比如如果我要求多個集合中,最大集合的個數要怎麼求呢?
#include
#include
#include
#include
//求最大集合中元素的個數
//裸的並查集加乙個秩陣列就可以了
using
namespace std;
const
int max =
10000005
;int h[max]
,k[max]
,maxx,max=
0,n,a,b;
void
init()
}int
find
(int x)
return h[x];}
void
join
(int x,
int y)
}int
main()
init()
; maxx =0;
for(
int i =
1;i <=n;
++ i)
printf
("%d\n"
,maxx);}
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編號...