蒟蒻求救。。。并查集加离散化WA了两个点
查看原帖
蒟蒻求救。。。并查集加离散化WA了两个点
187407
huangbohan楼主2020/8/19 16:49

rt,WA了第四和第八个测试点,调了好久 以下是代码,烦大佬路过指导一下

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
struct node
{
	int x,y,e;
};
node c[1000005];
int N,T,tot;
int b[2000005],a[2000005],f[2000005];
int query(int x)
{
	return lower_bound(a+1,a+1+tot,x)-a;
}
int find(int x)
{
	if(f[x]==x) return x;
	return f[x]=find(f[x]);
}
void merge(int x,int y)
{
	f[find(x)]=find(y);
}
int cmp(node a,node b)
{
	return a.e>b.e;
}
int comp(int a,int b)
{
	return a<b;
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		tot=0;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(f,0,sizeof(f));
		scanf("%d",&N);
		for(int i=1;i<=N;i++)
		{
			scanf("%d %d %d",&c[i].x,&c[i].y,&c[i].e);
			b[i<<1-1]=c[i].x;
			b[i<<1]=c[i].y;
		}
		sort(b+1,b+1+2*N,comp);
		for(int i=1;i<=2*N;i++)
		{
			if(b[i-1]!=b[i])
			a[++tot]=b[i];
		}
		for(int i=1;i<=tot;i++)
		f[i]=i;
		sort(c+1,c+1+N,cmp);
		bool ok=0;
		for(int i=1;i<=N;i++)
		{
			c[i].x=query(c[i].x);
			c[i].y=query(c[i].y);
			if(!c[i].e)
			{
				if(find(c[i].x)==find(c[i].y))
				{
//					printf("%d %d::::::\n",c[i].x,c[i].y);
//					printf("%d %d:::::::\n",find(query(c[i].x)),find(query(c[i].y)));
					ok=1;break;				
				}
			}
			else if(find(c[i].x)!=find(c[i].y)) merge(c[i].x,c[i].y);
		}
		if(!ok) printf("YES\n");
		else printf("NO\n");
	} 
	return 0;
} 
2020/8/19 16:49
加载中...