处理不相交集合的合并于查询问题
模板:
#include<iostream> //并查集
#define N 100
using namespace std;
int pre[N];
int n,m;
int find(int x) //递归写法
{
if(x!=pre[x])
pre[x]=find(pre[x]);
return pre[x];
}
int unionSearch(int root) //非递归写法,更快
{
int son,temp;
son=root;
while(root!=pre[root]) //找根节点
{
root=pre[root];
}
while(son!=root) //路径压缩
{
temp=pre[son];
pre[son]=root;
son=temp;
}
return root;
}
void join(int a,int b) //合并
{
int inf1=find(a);
int inf2=find(b);
if(inf1!=inf2)
{
pre[inf1]=inf2;
}
}
void init()
{
for(int i=1;i<=n;i++)
{
pre[i]=i;
}
}
int main()
{
cin>>n>>m;
init();
int a,b;
for(int i=0;i<m;i++)
{
cin>>a>>b;
join(a,b);
}
return 0;
}