题目描述
在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。
考虑一个约束满足问题的简化版本:假设 x1,x2,x3,…�1,�2,�3,… 代表程序中出现的变量,给定n�个形如xi=xj��=��或xi≠xj��≠�� 的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。
例如,一个问题中的约束条件为:x1=x2,x2=x3,x3=x4,x1≠x4�1=�2,�2=�3,�3=�4,�1≠�4,这些约束条件显然是不可能同时被满足的,因此这个问题应判定为不可被满足。
现在给出一些约束满足问题,请分别对它们进行判定。
输入
输入文件的第11行包含11个正整数t�,表示需要判定的问题个数。注意这些问题之间是相互独立的。
对于每个问题,包含若干行:
第11行包含11个正整数n�,表示该问题中需要被满足的约束条件个数。
接下来n�行,每行包括33个整数i,j,e�,�,�,描述11个相等/不等的约束条件,相邻整数之间用单个空格隔开。若e=1�=1,则该约束条件为xi=xj��=��;若e=0�=0,则该约束条件为xi≠xj��≠��。
输出
输出文件包括t�行。
输出文件的第11行输出一个字符串“YES”
或者“NO”
(不包含引号,字母全部大写),“YES”
表示当前问题判定为可以被满足,“NO”
表示不可被满足。
输入样例1
2
2
1 2 1
1 2 0
2
1 2 1
2 1 1
输出样例1
NO
YES
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
class UnionSet {
public:UnionSet(int n) : fa(n + 1) {for (int i = 0; i <= n; i++) fa[i] = i;}int get(int x) {return fa[x] = (fa[x] == x ? x : fa[x]);}void merge(int a, int b) {fa[get(a)] = get(b);return;}vector<int> fa;
};struct Dara {int i, j, e;
};
void solve() {int n, cnt = 0;cin >> n;vector<Dara> arr(n);unordered_map<int, int> h;for (int i = 0; i < n; i++) {cin >> arr[i].i >> arr[i].j >> arr[i].e;if (h.find(arr[i].i) == h.end()) h[arr[i].i] = cnt++;if (h.find(arr[i].j) == h.end()) h[arr[i].j] = cnt++;}UnionSet u(2 * n);for (int i = 0; i < n; i++) {if (arr[i].e == 0) continue;u.merge(h[arr[i].i], h[arr[i].j]);}int flag = 1;for (int i = 0; i < n && flag; i++) {if (arr[i].e == 1) continue;if (u.get(h[arr[i].i]) == u.get(h[arr[i].j])) {flag = 0;}}if (flag) cout << "YES" << endl;else cout << "NO" << endl;return;
}
int main() {int m;cin >> m;while (m--) {solve();}return 0;
}