news 2026/6/23 22:58:50

洛谷 P1955 [NOI2015] 程序自动分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
洛谷 P1955 [NOI2015] 程序自动分析

题目描述

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

考虑一个约束满足问题的简化版本:假设 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; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 5:49:14

Python中append()方法的使用、原理及效率解析

在Python编程中&#xff0c;列表的append()方法是一个基础且高频使用的操作&#xff0c;用于在列表末尾添加新元素。它看似简单&#xff0c;却直接影响着代码的效率与可读性。许多开发者因其便利性而过度依赖&#xff0c;却忽略了其背后的原理和潜在的性能陷阱。理解append()的…

作者头像 李华
网站建设 2026/6/23 16:08:04

评管理信息系统教材:过时问题、理论实践结合及专业适配性

对《管理信息系统》教材进行客观审视&#xff0c;有助于我们认识其在教学与实践中的真实价值。一本优秀的教材应紧跟技术变革&#xff0c;平衡理论与应用&#xff0c;成为连接课堂与商业世界的桥梁。以下将从几个具体角度&#xff0c;分析这部教材可能存在的优势与不足。 管理信…

作者头像 李华
网站建设 2026/6/23 16:13:11

生产执行系统怎么选?2025年制造业高性价比MES系统推荐

生产执行系统&#xff08;MES&#xff09;作为制造业数字化转型的核心枢纽&#xff0c;正深刻重塑现代工厂的运行逻辑与管理范式。它并非简单的数据采集工具&#xff0c;而是连接企业战略层&#xff08;ERP&#xff09;与底层自动化设备&#xff08;如SCADA、DCS&#xff09;的…

作者头像 李华
网站建设 2026/6/23 16:32:41

降aigc提示词排名:10大工具+高效推荐

降aigc提示词排名&#xff1a;10大工具高效推荐 10款降AIGC工具核心特点速览 排名 工具名称 降AIGC效率 特色功能 适用场景 1 Aibiye ★★★★★ 全文降AI率/报告降AI率 学术论文全流程优化 2 AICheck ★★★★☆ AI内容检测智能改写 论文/报告原创性提升 3 As…

作者头像 李华
网站建设 2026/6/23 18:12:02

Obsidian Linter完整使用指南:让你的笔记格式统一专业

Obsidian Linter完整使用指南&#xff1a;让你的笔记格式统一专业 【免费下载链接】obsidian-linter An Obsidian plugin that formats and styles your notes with a focus on configurability and extensibility. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-li…

作者头像 李华