YbtOJ 并查集课堂过关 例2 程序自动分析【并查集】

该博客主要讨论了一种处理连接问题的算法,利用并查集数据结构。文章指出,当给定边的权重为1时进行连接,权重为0时检查连接状态。由于数据规模较大,采用了离散化技巧来优化处理。代码中展示了如何实现这一过程,并在每个测试用例后输出连接状态('YES'或'NO')。
摘要由CSDN通过智能技术生成

在这里插入图片描述


思路

这道题首先很容易得出结论:
如果 e = 1 e=1 e=1 就把数加入并查集,如果 e = 0 e=0 e=0 就判断数是否加入并查集。
然后很烦的就是数据太大,要离散化,调了我好久。

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int fa[1001000],d[3000010]; 
int t,e,n,m,w,l;
struct node
{
	int x,y,e;
}a[1000100];
int find(int f)
{
	if(fa[f]==f)
	  return f;
	return fa[f]=find(fa[f]);
}
bool cmp(const node&l,const node&r)
{
	return l.e>r.e;
}
int main()
{
	cin>>t;
	while(t--)
	 {
	 	memset(d,0,sizeof(d));
	 	memset(fa,0,sizeof(fa));
	 	scanf("%d",&n);
		l=0,w=1;
	 	for(int i=1; i<=n; i++)
		 {
			scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].e);
			d[++l]=a[i].x;
			d[++l]=a[i].y;
		 }
		sort(d+1,d+1+l);
		int wd=unique(d+1,d+1+l)-d;
		for(int i=1; i<=n; i++)
		 {
			a[i].x=lower_bound(d+1,d+1+wd,a[i].x)-d;
			a[i].y=lower_bound(d+1,d+1+wd,a[i].y)-d;
		 }
		sort(a+1,a+1+n,cmp);
	 	for(int i=1; i<=wd; i++)
	 	   fa[i]=i;
		for(int i=1; i<=n; i++)
	 	 {
	 	 	int fx=find(a[i].x),fy=find(a[i].y);
		    if(a[i].e==1)
		     {
		       if(fx!=fy)
		        fa[fx]=fy;
		     }
		    else
		     {
		       if(fx==fy)
		        {
		     	   w=0;
		     	   break;
		        }
		     }
		 }
		if(w==0)
		  cout<<"NO"<<endl;
		else
		  cout<<"YES"<<endl;
	 } 
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值