并查集入门:PID331 / 家族——并查集
题目大意:n个人中有m对亲戚关系,之后询问p对是否有亲戚关系
注意:
1、初始化Tree[i]=-1
2、在合并两个集合时要先判断是否在一个集合(x1!=x2)
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
int n,m,p;
int Tree[5001];
int findfa(int x)
{
if (Tree[x]==-1)
return x;
int temp=findfa(Tree[x]);
Tree[x]=temp;
return temp;
}
int main()
{
int i,a,b,x1,x2;
cin>>n>>m>>p;
for (i=1;i<=n;i++)//初始化
Tree[i]=-1;
for (i=0;i<m;i++)
{
cin>>a>>b;
x1=findfa(a);
x2=findfa(b);
if (x1!=x2)//别忘了判断!
Tree[x1]=x2;
}
for (i=1;i<=p;i++)
{
cin>>a>>b;
if (findfa(a)!=findfa(b))
cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return 0;
}
并查集提高1:[NOIP2010]关押罪犯——并查集,最小生成树变形
题目大意:N个人有M对关系值