NOI2015 程序自动分析
题目链接:戳我
就是并查集水题.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#define MAXN 1000010
using namespace std;
int n,T,cnt;
int fa[MAXN];
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
map<int,int>id;
struct Line{int x,y,op;}line[MAXN];
inline bool cmp(struct Line a,struct Line b){return a.op>b.op;}
inline bool check()
{
for(int i=1;i<=n;i++)
{
int x=id[line[i].x],y=id[line[i].y];
int a=find(x),b=find(y);
// printf("x=%d y=%d a=%d b=%d op=%d\n",x,y,a,b,line[i].op);
if(line[i].op==0)
{
if(a==b) return false;
}
else if(line[i].op==1)
{
if(a!=b) fa[a]=b;
}
}
return true;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d",&T);
while(T--)
{
cnt=0;
id.clear();
scanf("%d",&n);
// printf("n=%d\n",n);
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d%d",&x,&y,&line[i].op);
if(!id.count(x)) id[x]=++cnt;
if(!id.count(y)) id[y]=++cnt;
line[i].x=x,line[i].y=y;
}
sort(&line[1],&line[n+1],cmp);
for(int i=1;i<=cnt;i++) fa[i]=i;
// printf("cnt=%d\n",cnt);
if(check()==true) printf("YES\n");
else printf("NO\n");
}
return 0;
}