并查集的简单介绍
1、初始情况四个点的父节点都为本身:FA[1]=1,FA[2]=2…
2、当生成的随机数为1,2时找到1,2的父节点分别为FA[1]=1,FA[2]=2,父节点不同进行连接。
3、生成的随机数为1,3,连接1,3这条边。
4、生成的随机数为2,3,不进行连边。
5、生成的随机数为2,4,连边
CODE:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
int FA[maxn],N;
int union_find(int x)//并查集判环
{
if(FA[x]==x)return x;
else return FA[x]=union_find(FA[x]);//返回时进行赋值查找效率变为:O(1)
}
int main()
{
ofstream ofile;
ofile.open("input1.txt");
N=10; //通过改变N的规模改变数据规模大小
ofile<<N<<'\n';
for(int i=1;i<=N;i++)
{
//随机数的奇偶性决定正负
if(rand()%2){ofile<<rand()%N<<' ';}
else ofile<<-rand()%N<<' ';
}
ofile<<'\n';
for(int i=1;i<=N;i++)FA[i]=i;//父节点初始化
int mid=N*700;//边的随机数量应该要多一些,以保证整个图的连通
while(mid--)
{
int a=rand()%N+1,b=rand()%N+1;
int fa=union_find(a),fb=union_find(b);
if(fa==fb)continue;//父节点相同时连这条边将成环
else
{
// cout<<"a: "<<a<<" b: "<<b<<'\n';
// cout<<"fa: "<<fa<<" fb: "<<fb<<'\n';
//这个地方之前写错了
FA[fa]=fb;
ofile<<a<<' '<<b<<'\n';//否则连这条边
}
}
}