BZOJ 4195 并查集+离散化入门 可用来练习这两个知识点

https://www.lydsy.com/JudgeOnline/problem.php?id=4195

离散化  用数组进行处理,比map稍微快一丢丢。。。

#include<bits/stdc++.h>
using namespace std;
const int M = 1000000+100;
int fa[M];
int sa[M],sb[M];
int a[M*2],b[M];
int ta[M],tb[M];
int e[M];
int get(int x)
{
	if(fa[x]==x)
	return x;
	return fa[x]=get(fa[x]);
}
void merge(int x,int y)
{
	fa[get(x)]=get(y);
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		for(int i=1;i<=1000000;i++)fa[i]=i;
		int z,x,y,n;
		cin>>n;
		for(int i =1; i <=n;i++)
		{
			scanf("%d %d %d",&sa[i],&sb[i],&z);
			a[i]=sa[i],a[i+n]=sb[i],e[i]=z;
		}
		sort(a+1,a+1+n+n);
	//	int numa=unique(a+1,a+1+n+n)-(a+1);
		for(int i=1;i<=n;i++)
		{
			ta[i]=lower_bound(a+1,a+1+n+n,sa[i])-a;
			tb[i]=lower_bound(a+1,a+1+n+n,sb[i])-a;
		}
		for(int i =1; i <=n;i++)
		{
			if(e[i])
				merge(ta[i],tb[i]);
		}
		bool f=true;
		for(int i =1;i<=n;i++)
		{
			if(!e[i])
			{
				if(get(ta[i])==get(tb[i]))
				f=false;
			}
		}
		if(f)
			puts("YES");
		else 
			puts("NO");
	}
	
	return 0;
 } 

用map进行离散,这样没有排序,但这一题不需要排序,只要判断就行

                int a=to[x];if(a==0){a=++n;to[x]=fa[a]=a;}
                int b=to[y];if(b==0){b=++n;to[y]=fa[b]=b;}
                if(z)  
                      merge(to[x],to[y]);
                else     
                       s[++num]=a,t[num]=b;

猜你喜欢

转载自blog.csdn.net/bjfu170203101/article/details/88980820