在并查集的时候经常遇到爆栈的情况,这里给推荐两种方法预防爆栈
①开外挂栈
#pragma comment(linker, "/STACK:1024000000,1024000000")
②增加一个数组用来保存结点的熵值,使得根节点离子结点平摊下来的距离最小,主要在合并的时候需要用到
if(cou[fa]>cou[fb]){
f[fb]=fa;
}
else {
f[fa]=fb;
cou[fb]++;
}
下面是模板
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<string>
#include<cmath>
#include<iostream>
using namespace std;
#define LL long long
#define ULL unsigned long long
int f[100005],cou[100005];
int res;
int find(int x){
if(f[x]!=x)
f[x] =find(f[x]);
return f[x];
}
void Union(int a,int b){
int fa = find(a);
int fb = find(b);
if(fa==fb) return false;
//并查集熵低的当父亲
if(cou[fa]>cou[fb]){
f[fb]=fa;
}
else {
f[fa]=fb;
cou[fb]++;
}
}
int main(void){
return 0;
}