并查集是树形的数据结构,用于处理一些不交集的合并及查询问题。
并查集模板题:https://vjudge.net/problem/19354/origin
通过合并子集将所有相关联的元素归并到一棵树上。
通过递归查找元素的根节点。
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int a[1010];
int find(int x)//递归查找根节点
{
if(a[x]==x)
return x;
else
{
//路径压缩,每次查找都把遇到的不是根节点的节点连接到根节点上。
a[x]=find(a[x]);
return a[x];
}
}
void add(int x,int y)//合并两个子集
{
int t1,t2;
t1=find(x);
t2=find(y);
if(a[t1]!=a[t2])
{
a[t2]=t1;
}
return;
}
int main ()
{
int t;
cin>>t;
while(t--)
{
int n,m;
int sum=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
a[i]=i;
}
for(int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;
add(x,y);
}
for(int i=1;i<=n;i++)
{
if(a[i]==i)
sum++;
}
cout<<sum<<endl;
}
}
例如上图,左边是五个点之间的关系,当把3作为根节点的时候,3的根节点就是3自己,3本身和1,4相连,所以1,4的根节点变成3,5和1 相连,1的根节点是三,所以把5的根节点也变为3,(不是3连接1,1再连接5,而是5直接连接3)同理2的根节点变为3,所有节点都相连,根节点是3.