这道题好像可以不用并查集
  • 板块P1551 亲戚
  • 楼主aleavf
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/18 10:39
  • 上次更新2024/8/18 10:42:16
查看原帖
这道题好像可以不用并查集
1242018
aleavf楼主2024/8/18 10:39

思路就是把一个家族的人视为一个数字,用这个家族中最小的数表示

#include<bits/stdc++.h>
using namespace std;
long long a[11451411],x[114514][2],d;
int main(){
	long long n,m,s;
	cin>>n>>m>>s;
	for(int i = 1;i<=n;i++) a[i]=i;
	for(int i = 1;i<=m;i++){cin>>x[i][0]>>x[i][1];if(x[i][0]>x[i][1]) swap(x[i][0],x[i][1]);}//排序,小的在左大的在右 
	for(int i = 1;i<=m;i++)
		for(int j = i;j<=m;j++)
		if(x[j][0]<x[i][0]) swap(x[j],x[i]);//排序,让每个家族代表的数字都是这个家族最小的 
	for(int i = 1;i<=m;i++){
		d=max(a[x[i][0]],a[x[i][1]]);//找出两个亲人中间比较大的数,设小 
		a[x[i][0]]=min(a[x[i][0]],a[x[i][1]]);//把两个数送进同一个家族,取小的数为代号 
		a[x[i][1]]=min(a[x[i][0]],a[x[i][1]]);
		for(int j = 1;j<=n;j++)
		if(a[j]==d) a[j]=a[x[i][0]];//找出大的数d的家族,把他们合并进小的数的家族 
	}
	for(int i = 1;i<=s;i++){
		long long c,b;
		cin>>c>>b;
		if(a[c]==a[b])cout<<"Yes"<<endl;//如果两个数相等就说明被我们放入了同一个家族,有血缘关系 
		else cout<<"No"<<endl;
	}
}
2024/8/18 10:39
加载中...