[NOI2015] 程序自动分析
洛谷
准备知识:离散化,并查集。
离散化参考博文
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+100;
int temp[maxn];
int pre[maxn];
void init()
{
for(int i=0;i<maxn;i++)
{
pre[i]=i;
}
}
struct Node{
int x;
int y;
int e;
}a[maxn];
int find(int x)
{
return pre[x]=x==pre[x]?x:find(pre[x]);
}
void merge(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fx]=fy;
}
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--)
{
init();
int n;
cin>>n;
int p=0;
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y>>a[i].e;
temp[p++]=a[i].x;
temp[p++]=a[i].y;
}
p--;
sort(temp,temp+p);
int m=unique(temp,temp+p)-temp;
for(int i=1;i<=n;i++)
{//离散化
a[i].x= lower_bound(temp,temp+m,a[i].x)-temp;
a[i].y= lower_bound(temp,temp+m,a[i].y)-temp;
}
queue<pair<int,int> > q;
for(int i=1;i<=n;i++)
{
if(a[i].e==0)q.push(make_pair(a[i].x,a[i].y));
else{
merge(a[i].x,a[i].y);
}
}
int t1,t2;
bool f=true;
while(!q.empty())
{
if(find(q.front().first)==find(q.front().second))
{
f=false;
break;
}
q.pop();
}
if(f)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}