NOI2015 程序自动分析

题目描述

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

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

现在给出一些约束满足问题,请分别对它们进行判定。

输入输出格式

输入格式:

从文件prog.in中读入数据。

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

对于每个问题,包含若干行:

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

输出格式:

输出到文件 prog.out 中。

输出文件包括t行。

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

输入输出样例

输入样例#1:
2
2
1 2 1
1 2 0
2
1 2 1
2 1 1
输出样例#1:
NO
YES

然后可以发现输入顺序跟答案无关。。。
那么可以把相等的先处理。。。
用并查集维护相等。。。
然后处理不相等的。。。
如果xi和xj不相等且处在同一个并查集里面那么就输出NO。。。
如果都不输出NO的话就输出YES。。。
嗯完了。。。
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <map>
 7 
 8 using namespace std;
 9 
10 int T, n;
11 
12 struct EQU {
13     long long x, y, e;
14 } equ[100010], e_equ[100010], e_unequ[100010];
15 
16 int cnt[200010], fa[200010], p1, p2;
17 
18 int find(int x) {
19     return x == fa[x] ? x : fa[x] = find(fa[x]);
20 }
21 
22 void uni(int x, int y) {
23     x = find(x), y = find(y);
24     if(x != y)
25         fa[x] = y;
26 }
27 
28 bool binded(int x, int y) {
29     return find(x) == find(y);
30 }
31 
32 int main() {
33     scanf("%d", &T);
34     while(T --) {
35         p1 = p2 = 0;
36         scanf("%d", &n);
37         for(int i = 1 ; i <= n ; i ++) {
38             scanf("%lld%lld%lld", &equ[i].x, &equ[i].y, &equ[i].e);
39             cnt[i] = equ[i].x;
40             cnt[i + n] = equ[i].y;
41             fa[i] = i;
42             fa[i + n] = i + n;
43         }
44         sort(cnt + 1, cnt + 1 + n * 2);
45         for(int i = 1 ; i <= n ; i ++) {
46             equ[i].x = lower_bound(cnt + 1, cnt + 1 + n * 2, equ[i].x) - cnt;
47             equ[i].y = lower_bound(cnt + 1, cnt + 1 + n * 2, equ[i].y) - cnt;
48             if(equ[i].e == 1)
49                 e_equ[p1 ++] = equ[i];
50             else 
51                 e_unequ[p2 ++] = equ[i];
52         }
53         for(int i = 0 ; i < p1 ; i ++)
54             uni(e_equ[i].x, e_equ[i].y);
55         for(int i = 0 ; i < p2 ; i ++)
56             if(binded(e_unequ[i].x, e_unequ[i].y)) {
57                 puts("NO");
58                 goto nxt;
59             }
60         puts("YES");
61         nxt:;
62     }
63 }
View Code

 

posted @ 2017-08-14 21:48  KingSann  阅读(170)  评论(0编辑  收藏  举报