当前位置: 代码迷 >> 综合 >> 洛谷1955 NOI2015 程序自动分析
  详细解决方案

洛谷1955 NOI2015 程序自动分析

热度:65   发布时间:2023-12-06 08:38:12.0

题目:程序自动分析


思路:

因为数据太大,所以要先离散化一下。

然后对于每个相等的条件,用并查集维护。

再遍历不相等的条件,对于每个条件 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 1000003int 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;
}