最基礎的並查集。
#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編號...