[Ejemplo 2 del capítulo 10 de Ybtoj] Análisis automático del programa [Colección de búsqueda combinada]

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí


La idea de resolver el problema
primero satisface todo xi = xj x_i = x_jXyo=XjRestricciones, solo use una y verifique para mantener

Y para xi ≠ xj x_i ≠ x_jXyo=XjCondición, juez xi x_iXyoY xj x_jXjSi están en el mismo conjunto, si lo están, indique xi x_iXyoDebería ser igual a xj x_jXj , Es una contradicción

Luego observe que el valor máximo de x llega a 1 0 9 10 ^ 91 09 , así que usa la discretización


Código

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

int t,n,fa[1000010],v[3000010],tot=0;
bool flag=1;
struct c{
    
    
	int x,y,e;
}a[1000010];
int find(int x)
{
    
    
	if(fa[x]!=x)return fa[x]=find(fa[x]);
	else return fa[x];
}
bool cmp(c l,c r){
    
    
	return l.e>r.e;
}
int main(){
    
    
	scanf("%d",&t);
	while(t--)
	{
    
    
		scanf("%d",&n);
		flag=1,tot=0;
		memset(v,0,sizeof(v));
		memset(a,0,sizeof(a));
		memset(fa,0,sizeof(fa));
		for(int i=1;i<=n;i++)
		{
    
    	
			scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].e);
			v[++tot]=a[i].x,v[++tot]=a[i].y;	
		}
		sort(v+1,v+tot+1);
		int len=unique(v+1,v+tot+1)-v;//去重后元素个数
		for(int i=1;i<=n;i++)
		{
    
    
			a[i].x=lower_bound(v+1,v+len+1,a[i].x)-v;
			a[i].y=lower_bound(v+1,v+len+1,a[i].y)-v;
		}
		for(int i=1;i<=len;i++)//并查集
			fa[i]=i;
		sort(a+1,a+n+1,cmp);
		for(int i=1;i<=n;i++)
		{
    
    
			int xx=find(a[i].x),yy=find(a[i].y);
			if(a[i].e==1)
				fa[xx]=yy;
			if(a[i].e==0&&xx==yy)
			{
    
    
				flag=0;
				printf("NO\n");
				break;
			}
		}
		if(flag)printf("YES\n");
	}
} 

Supongo que te gusta

Origin blog.csdn.net/kejin2019/article/details/115030068
Recomendado
Clasificación