程序自动分析

并查集+离散化

#include<bits/stdc++.h>
using namespace std;
void Cin(int &x)
{
    char c=getchar();x=0;
    while(c>'9'||c<'0')c=getchar();
    while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar();
}
int n,k,T;
struct bcj
{
    int l,r,v;
    
    bool operator <(const bcj&a)const
    {
        return v>a.v;
    }
    
}e[100001];
int dad[100001];
int b[200011];

int getfather(int x)
{
    if(dad[x]==x)
    return x;
    dad[x]=getfather(dad[x]);
    return dad[x];
}

void bf()
{
    for(int i=1;i<=2*n;i++)
    dad[i]=i;
    for(int i=1;i<=n;i++)
    {
        if(getfather(e[i].l)!=getfather(e[i].r)&&e[i].v==1)
        {
            dad[getfather(e[i].l)]=e[i].r;
        }
        else
        if(getfather(e[i].l)==getfather(e[i].r))
        {
            if(e[i].v==0)
            {
            cout<<"NO"<<endl;
            return;
            }
        }
    }
    cout<<"YES"<<endl;
}

void init()
{
      Cin(n);
      for(int i=1;i<=n;i++)
      {
          Cin(e[i].l),Cin(e[i].r),Cin(e[i].v);
          b[i]=e[i].l;
          b[i+n]=e[i].r;
      }
      sort(e+1,e+n+1);
      sort(b+1,b+2*n+1);
      for(int i=1;i<=n;i++)
      {
          e[i].l=lower_bound(b+1,b+2*n+1,e[i].l)-b;
          e[i].r=lower_bound(b+1,b+2*n+1,e[i].r)-b;
      }
}

int main()
{
      Cin(T);
      while(T--)
      {
      init();
      bf();
      }
    return 0;
}

 

posted @ 2017-08-09 09:34  WeiAR  阅读(208)  评论(0编辑  收藏  举报