题目:程序自动分析
思路:
因为数据太大,所以要先离散化一下。
然后对于每个相等的条件,用并查集维护。
再遍历不相等的条件,对于每个条件 x y 0 ,如果fa[x]==fa[y],则不可能。
代码:
#include<iostream>
#include<cstdio>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <cstring>
#include <map>
using namespace std;
#define maxn 100000
#define Mod 1000003
int n;
int head[Mod+5],nxt[Mod+5],t[Mod+5];
int num;
int a[maxn*2+5],b[maxn*2+5],c[maxn*2+5];
int fa[maxn*2+5];
int Ask(int x){
int y=x%Mod;
int u=head[y];
while(~u){
if(t[u]==x) return u;
u=nxt[u];
}
return 0;
}
int Add(int x){
int y=x%Mod;
int u=head[y];
head[y]=++num;
nxt[num]=u;
t[num]=x;
return num;
}
int find(int x) {
if(fa[x]==x) {
return x;
}
return fa[x]=find(fa[x]);
}
void init() {
for(int i=1; i<=2*maxn; i++) {
fa[i]=i;
}
memset(head,-1,sizeof(head));
memset(nxt,-1,sizeof(nxt));
num=0;
}
bool judge(){
for(int i=1;i<=n;i++){
if(!c[i]&&find(a[i])==find(b[i])){
return false;
}
}
return true;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
init();
scanf("%d",&n);
bool flag=true;
for(int i=1; i<=n; i++) {
int x,y,opr;
scanf("%d%d%d",&x,&y,&opr);
int askx=Ask(x);
if(!askx) askx=Add(x);
int asky=Ask(y);
if(!asky) asky=Add(y);
x=askx,y=asky;
a[i]=x,b[i]=y,c[i]=opr;
}
for(int i=1;i<=n;i++){
if(a[i]==b[i]&&!c[i]) {
printf("NO\n");
goto END;
}
}
for(int i=1;i<=n;i++){
if(c[i]){
int fa1=find(a[i]),fa2=find(b[i]);
fa[fa1]=fa2;
}
}
if(judge()) printf("YES\n");
else printf("NO\n");
END: ;
}
return 0;
}