HZOJ-322: 程序自动分析

 题目描述

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

​ 考虑一个约束满足问题的简化版本:假设 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 
#include 
#include 
#include 
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 fa;
};

struct Dara {
	int i, j, e;
};
void solve() {
	int n, cnt = 0;
	cin >> n;
	vector arr(n);
	unordered_map 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;
}

你可能感兴趣的:(算法题,算法)