并查集就是用来判断两个点是否在一个集合中,并带有合并集合的功能
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<math.h>
#define infinity 65535
#define maxsize 50
using namespace std;
int pre[10000];
int Find(int x)
{
int r=x;
while(r!=pre[r])
r=pre[r];
return r;
}
void Union(int x,int y)
{
int fx=Find(x),fy=Find(y);
if(fx!=fy)
pre[fx]=fy;
}
//优化后
for (int i = 0; i < N; i++)//并查集的初始化
pre[i] = i; // 每个节点的组号就是该节点的序号
for (int i = 0; i < N; i++)
sz[i] = 1; // 初始情况下,每个组的大小都是1
//sz是用来衡量集合的大小
int Find2(int p)
{
while (p != pre[p])
{
// 将p节点的父节点设置为它的爷爷节点
pre[p] =pre[id[p]];
p = pre[p];
}
return p;
}
void Union(int x,int y)
{
int n=Find2(x);
int m=Find2(Y);
if(n!=m)
{
if(sz[n]>sz[m])
{
pre[m]=n;//小树合并到大大树中(即小集合并入到大集合中)
sz[n]+=sz[m];
}
else
{
pre[n]=m;
sz[m]+=sz[n];
}
}
count--;//这个count开始时是集合的个数,后来随着节点的融合(集合个数的减少)而减少
}
int main()
{
return 0;
}