乌鲁木齐市网站建设_网站建设公司_轮播图_seo优化
2025/12/17 12:41:38 网站建设 项目流程

题目描述

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

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

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

输入格式

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

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

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

输出格式

输出包括 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

输入 #2复制

2 3 1 2 1 2 3 1 3 1 1 4 1 2 1 2 3 1 3 4 1 1 4 0

输出 #2复制

YES NO

说明/提示

【样例解释1】

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

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

【样例说明2】

在第一个问题中,约束条件有三个:x1​=x2​,x2​=x3​,x3​=x1​。只需赋值使得 x1​=x2​=x3​,即可同时满足所有的约束条件。

在第二个问题中,约束条件有四个:x1​=x2​,x2​=x3​,x3​=x4​,x4​=x1​。由前三个约束条件可以推出 x1​=x2​=x3​=x4​,然而最后一个约束条件却要求 x1​=x4​,因此不可被满足。

【数据范围】

所有测试数据的范围和特点如下表所示:

测试点编号n 的规模i,j 的规模约定
11≤n≤101≤i,j≤1041≤t≤10e∈{0,1}
2
31≤n≤100
4
51≤n≤105
6
7
81≤n≤1051≤i,j≤109
9
10
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; //解题思路:离散化+并查集 //离散化 int pos; int disc[N*2]; unordered_map<int,int> mp; //并查集 int fa[N*2]; struct node{ int x,y,z; }a[N]; int n; int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); } int un(int x,int y) { return fa[find(x)]=find(y); } bool issame(int x,int y) { return find(x)==find(y); } bool solve() { cin>>n; pos=0; mp.clear(); for(int i=1;i<=n;i++) { cin>>a[i].x>>a[i].y>>a[i].z; disc[++pos]=a[i].x; disc[++pos]=a[i].y; } //离散化 sort(disc+1,disc+1+pos); int cnt=0; for(int i=1;i<=pos;i++) { int x=disc[i]; if(mp.count(x)) continue; cnt++; mp[x]=cnt; } //初始化 for(int i=1;i<=cnt;i++) { fa[i]=i; } for(int i=1;i<=n;i++) { int x=a[i].x,y=a[i].y,z=a[i].z; if(z==1) un(mp[x],mp[y]); } for(int i=1;i<=n;i++) { int x=a[i].x,y=a[i].y,z=a[i].z; if(z==0) { if(issame(mp[x],mp[y])) return false; } } return true; } int main() { int T; cin>>T; while(T--) { if(solve()) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询