并查集

并查集

例题:P1551 亲戚 https://www.luogu.org/problem/P1551

这是一道典型的并查集例题,将亲戚关系转化成树状结构
先处理输入部分,n为节点数,m为关系数,p为询问个数、

fine 函数

int fine(int x)
{
return f[x]==x?x:f[x]=fine[f[x]];
}

全部代码

include

using namespace std;
int f[5010],n,m,p,a,b;
int fine(int x)
{
return f[x]==x?x:f[x]=fine(f[x]);
}

int main()
{
cin>>n>>m>>p;
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=m;i++)
{
cin>>a>>b;
f[fine(a)]=fine(b);
}
for(int i=1;i<=p;i++)
{
cin>>a>>b;
if(fine(a)==fine(b))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}

主要思路:将关系变成祖先与祖先的关系,最后对比2个节点祖先是否相同即可

并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题(不交集的意思是两个集合中没有相同的元素)。

并查集分两个主要步骤——合并,查找

posted @ 2019-08-02 14:06  BroAlanTaps  阅读(106)  评论(0)    收藏  举报