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;
}