[BZOJ4195] [NOI2015] 程序自动分析 (并查集)

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

Source

Solution

  把题看透就会发现这只是一道并查集的合并与查询的问题。

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <map>
 4 using namespace std;
 5 int a[1000005][2], fa[2000005];
 6 bool op[1000005];
 7 inline int getfa(int x) {
 8     return x == fa[x] ? x : fa[x] = getfa(fa[x]);
 9 }
10
11 int main() {
12     int T, n, cd = 0;
13     scanf("%d", &T);
14     while(T--) {
15         bool flag = true;
16         map<int, int> Map;
17         scanf("%d", &n);
18         for(int i = 1; i <= n; i++) {
19             int tmp;
20             scanf("%d%d%d", &a[i][0], &a[i][1], &tmp);
21             op[i] = tmp;
22             if(!Map[a[i][0]]) Map[a[i][0]] = ++cd;
23             if(!Map[a[i][1]]) Map[a[i][1]] = ++cd;
24         }
25         for(int i = 1; i <= cd; i++)
26             fa[i] = i;
27         for(int i = 1; i <= n; i++)
28             if(op[i]) {
29                 int p1 = getfa(Map[a[i][0]]), p2 = getfa(Map[a[i][1]]);
30                 fa[p1] = p2;
31             }
32         for(int i = 1; i <= n; i++)
33             if(!op[i]) {
34                 int p1 = getfa(Map[a[i][0]]), p2 = getfa(Map[a[i][1]]);
35                 if(p1 == p2) {
36                     flag = false; break;
37                 }
38             }
39         cd = 0;
40         if(flag) puts("YES");
41         else puts("NO");
42     }
43     return 0;
44 }

时间: 2024-08-06 18:08:08

[BZOJ4195] [NOI2015] 程序自动分析 (并查集)的相关文章

bzoj4195 [Noi2015]程序自动分析——并查集

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4195 突然在这道大水题上WA了半天... 思路很简单,离线处理询问,先把 = 的都加到并查集里,再暴力判断 != 的: 然而WA了许多遍...对离散化还是太不熟悉了... 1.fa[] 数组的预处理!平时写的手熟,上来就 for(i=1;i<=n;i++),完全忘了离散化后怎样怎样了啊!! 2. unique 的时候需要 -1! 3. lower_bound 时不要多 -1! 代码如下:

洛谷P1955 [NOI2015] 程序自动分析 [并查集,离散化]

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

BZOJ 4195: [Noi2015]程序自动分析 [并查集 离散化 | 种类并查集WA]

题意: 给出若干相等和不等关系,判断是否可行 woc NOI考这么傻逼的题飞快打了一个种类并查集交上了然后爆零... 发现相等和不等看错了异或一下再叫woc90分 然后发现md$a \neq b, a \neq c,不能得到b = c$ 老老实实的把所有相等关系加并查集然后不等关系来判断吧,唉 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using

bzoj4195[Noi2015]程序自动分析

bzoj4195[Noi2015]程序自动分析 题意: t组数据,每组n个给出两个变量是相等还是不等的约束条件,要求判断是否能满足.n≤1000000,变量数量≤109 题解: 先离散化,然后只处理相等条件用并查集维护“相等集合”,接着对每个不相等条件判断是否在一个集合,是的话则说明不满足. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue&g

[UOJ#127][BZOJ4195][NOI2015]程序自动分析

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

NOI 2015 DAY1 T1 程序自动分析 并查集+离散化

题意:暂且并没有链接 方法:并查集+离散化 解析: 国赛这道普及组难度的题我都不好意思写题解, 这道题的题意非常明了,一眼题.. 其实就是把所有的要求sort一下,把令xi=xj的条件放在前面,令xi!=xj的条件放到后面就行了. 然后我们对于n个询问,先把所有的i,j离散化,这里我偷懒用了map 然后只需要将所有xi=xj的部分加到并查集里. xi!=xj的部分看一下二者的祖先相不相同就行了,不相同就判断下一个,相同输出no: 代码: 这道题贴代码真是不好意思- - #include <map

【BZOJ 4195】[Noi2015]程序自动分析

[Noi2015]程序自动分析 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 630  Solved: 270[Submit][Status][Discuss] Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述

bzoj 4195: [Noi2015]程序自动分析

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

【bzoj4195】[Noi2015]程序自动分析

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