BZOJ 4195: [Noi2015]程序自动分析 哈希表 并查集

来源:互联网 发布:淘宝上抓卖保健品的 编辑:程序博客网 时间:2024/04/16 23:26

4195: [Noi2015]程序自动分析

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 2013  Solved: 948
[Submit][Status][Discuss]

Description

 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。

考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。例如,一个问题中的约束条件为:x1=x2,x2=x3,x3=x4,x1≠x4,这些约束条件显然是不可能同时被满足的,因此这个问题应判定为不可被满足。
现在给出一些约束满足问题,请分别对它们进行判定。

Input

输入文件的第1行包含1个正整数t,表示需要判定的问题个数。注意这些问题之间是相互独立的。

对于每个问题,包含若干行:
第1行包含1个正整数n,表示该问题中需要被满足的约束条件个数。
接下来n行,每行包括3个整数i,j,e,描述1个相等/不等的约束条件,相邻整数之间用单个空格隔开。若e=1,则该约束条件为xi=xj;若e=0,则该约束条件为xi≠xj。

Output

输出文件包括t行。

输出文件的第k行输出一个字符串“YES”或者“NO”(不包含引号,字母全部大写),“YES”表示输入中的第k个问题判定为可以被满足,“NO”表示不可被满足。

Sample Input

2
2
1 2 1
1 2 0
2
1 2 1
2 1 1

Sample Output

NO
YES

HINT

 在第一个问题中,约束条件为:x1=x2,x1≠x2。这两个约束条件互相矛盾,因此不可被同时满足。


在第二个问题中,约束条件为:x1=x2,x2=x1。这两个约束条件是等价的,可以被同时满足。


1≤n≤1000000

1≤i,j≤1000000000

蒟蒻A题法

嗯 就是这样


#include<cmath>#include<ctime>#include<cstdio>#include<cstring>#include<cstdlib>#include<complex>#include<iostream>#include<algorithm>#include<iomanip>#include<vector>#include<string>#include<bitset>#include<queue>#include<set>#include<map>using namespace std;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=10*x+ch-'0';ch=getchar();}return x*f;}inline void print(int x){if(x<0)x=-x,putchar('-');if(x>=10)print(x/10);putchar(x%10+'0');}const int N=8500000,M=100100;const int mod=(1<<23)-1;int n,a[M][2];int fa[N],ht[N];void initial(){memset(ht,0,sizeof(ht));memset(a,0,sizeof(a));memset(fa,0,sizeof(fa));}inline int hsh(int x){int num=x;x&=mod;while(1){if(!ht[x]){ht[x]=num;fa[x]=x;return x;}if(ht[x]==num)return x;if(ht[x]!=num){x++;if(x==N)x=0;}}return x;}inline int find(int x){int t=x;while(t!=fa[t])t=fa[t];while(x!=fa[x])x=fa[x],fa[x]=t;return x;}int main(){int T=read();while(T--){n=read();bool flag=1;while(n--){int x=read(),y=read(),opt=read();if(opt==1){int hx=hsh(x),hy=hsh(y);fa[find(hx)]=find(hy);}else {a[++a[0][0]][0]=x;a[a[0][0]][1]=y;}}register int i,hx,hy;for(i=1;i<=a[0][0];++i){hx=hsh(a[i][0]),hy=hsh(a[i][1]);if(find(hx)==find(hy)){puts("NO");flag=0;break;}}if(flag)puts("YES");initial();}return 0;}


阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 摩托车头盔起雾怎么办 真皮沙发太软了怎么办 老师硬让换班怎么办 同事经常要换班怎么办 怀孕在家没钱花怎么办 摩托车车把歪了怎么办 摩旅 手机不防水怎么办 头盔镜片花了怎么办 踏板摩托车速度底怎么办 摩托车头盔小了怎么办 房东和租客纠纷怎么办 租客与房东纠纷怎么办 乙肝打了瘦脸针怎么办 去绣水搞到手上痛怎么办 脚破了皮很痛怎么办 脚被车撞了肿了怎么办 ps4光盘花了怎么办 耳后总是长孑子怎么办 孩孑高三总是玩手机怎么办 摩托车被收了怎么办 摩托车的手续都怎么办 摩托车罚单掉了怎么办 行人遇到黄灯该怎么办 长辈借钱不还怎么办 不绣刚电梯轿壁有凹槽怎么办 电梯下限位故障怎么办 卫生间夏天太热怎么办 07大檐帽变形了怎么办 税务局不批发票怎么办 进项发票太多了怎么办 发票报销联丢失怎么办 发票领用簿没有怎么办 发票购买本遗失怎么办 销售方遗失发票怎么办 增值税发票发票联丢失怎么办 苹果购买发票丢失怎么办 空白增值税发票发票丢失怎么办 网购发票 领购簿怎么办 购物发票丢了怎么办 饭店客人买单要少钱怎么办 发票备注栏写错怎么办