【SSL】1896家族(并查集)

【SSL】1896家族(并查集)

Time Limit:1000MS
Memory Limit:65536K

Description

若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。

Input

第一行:三个整数n,m,p,(n<=50000,m<=50000,p<=50000),分别表示有n个人,m个亲戚关系,询问p对亲戚关系。以下m行:每行两个数Mi,Mj,1<=Mi,Mj<=N,表示Ai和Bi具有亲戚关系。接下来p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。

Output

P行,每行一个’Yes’或’No’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。

Sample Input

6 5 3
41 2
1 5
3 4
5 2
1 3
1 4
2 3
5 6

Sample Output

Yes
Yes
No

思路

用并查集做。
并查集是一种树型的数据结构,用于处理一些不相交集合的合并问题。并查集的主要操作有:
1-合并两个不相交集合
2-判断两个元素是否属于同一个集合
3-路径压缩
其精确定义如下:
FIND(x):寻找并返回包含元素x的集合的名字。
UNION(x,y):包含元素x和y的两个集合用它们的并集替换。并集的名字或者是原来的包含元素x那个集合的名字,或者是原来包含元素y的那个集合的名字。
我们的目的是设计这两种运算的有效算法。这种数据结构既要简单、同时又要高效的实现合并和查找两种运算。满足条件的数据结构是用根树来表示每个集合,集合中的元素存贮在节点中,树中除根节点外的每个元素都指向父节p(x)的指针。根有一个空指针,用做集合的名字或集合的代表。这样就产生了一个森林,其中每棵树对应一个集合。
对于任意假定元素x,用root(x)表示包含x的树的根。那么find(x)总是返回root(x),由于合并运算必须有两棵树的根作为它的参数,我们假定对于任意两个元素x和y,UNION(x,y)实际上表示UNION(root(x),root(y))。
路径压缩
为了进一步增强堆寻找运算性能,路径压缩的措施被使用。在FIND(x)运算中,找到根节点y后,我们再进行一次遍历从x到y的路径,并沿着路径改变所有节点指向父节点的指针,使它直接指向y。

FIND 具体算法:
输入:节点x。 输出:root(x),包含x的树的根。
int find(int x)
{
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}

UNION算法
输入:两个元素x和y。
输出:包含x和y的两棵树的合并,原来的树被破坏。
void unionn(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx<fy) fa[fy]=fx;
else fa[fx]=fy;
}

代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,p,f[50010];
void makenull()//初始化 
{
    
    
	for(int i=1;i<=n;f[i]=i,i++);
	return;
}
int find(int x)//找代表值 
{
    
    
	if(x==f[x])return x;
	return f[x]=find(f[x]);
}
void merge(int x,int y)//合并
{
    
    
	f[find(y)]=find(x);
	return;
}
bool connect(int x,int y)//判断同连通块 
{
    
    
	return (find(x)==find(y));
}
int main()
{
    
    
	int i,x,y;
	scanf("%d%d%d",&n,&m,&p);
	makenull();
	for(i=1;i<=m;i++)//合并 
	{
    
    
		scanf("%d%d",&x,&y);
		merge(x,y);
	}
	for(i=1;i<=p;i++)
	{
    
    
		scanf("%d%d",&x,&y);
		if(connect(x,y)) printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_46975572/article/details/112972729