news 2026/4/16 13:29:09

洛谷 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/4/9 19:37:39

KITTI-360数据集:自动驾驶技术研究的终极解决方案

KITTI-360数据集&#xff1a;自动驾驶技术研究的终极解决方案 【免费下载链接】kitti360Scripts This repository contains utility scripts for the KITTI-360 dataset. 项目地址: https://gitcode.com/gh_mirrors/ki/kitti360Scripts KITTI-360数据集是一个专门为自动…

作者头像 李华
网站建设 2026/4/16 12:04:52

shell编程基础:自动化备份及错误异常处理方法

shell脚本是将多个命令组织成程序、实现自动化任务的核心工具。它不仅是Linux/Unix系统管理员的基本功&#xff0c;也广泛应用于开发、测试和日常运维中&#xff0c;能显著提升工作效率和操作的可靠性。掌握shell编程&#xff0c;意味着你能够将重复性劳动交给机器&#xff0c;…

作者头像 李华
网站建设 2026/4/16 10:41:41

PM2 WebUI:告别命令行,可视化Node.js应用管理的终极方案

PM2 WebUI&#xff1a;告别命令行&#xff0c;可视化Node.js应用管理的终极方案 【免费下载链接】pm2-webui PM2 WebUI. Opensource Alternative to PM2 Plus. Minimalistic App Manager and Log Viewer 项目地址: https://gitcode.com/gh_mirrors/pm/pm2-webui 还在为复…

作者头像 李华
网站建设 2026/4/16 2:48:32

探索开源机械臂:低成本智能自动化创新实践

在当今技术快速发展的时代&#xff0c;开源机械臂正以革命性的方式重塑机器人技术的应用边界。对于想要深入了解DIY机器人的新手和普通用户来说&#xff0c;Faze4六轴机械臂提供了一个绝佳的入门平台&#xff0c;让每个人都能以经济实惠的方式探索智能控制方案的无限可能。 【免…

作者头像 李华
网站建设 2026/4/16 12:11:40

EmotiVoice语音合成在心理治疗语音日记中的正向引导作用

EmotiVoice语音合成在心理治疗语音日记中的正向引导作用 在快节奏、高压力的现代生活中&#xff0c;越来越多的人面临情绪困扰与心理健康挑战。传统的心理咨询受限于资源稀缺、成本高昂和隐私顾虑&#xff0c;难以覆盖广泛人群。而数字疗法的兴起&#xff0c;尤其是基于AI的智…

作者头像 李华
网站建设 2026/4/15 16:47:59

Label Studio多语言配置终极指南:三步完成界面本地化

Label Studio多语言配置终极指南&#xff1a;三步完成界面本地化 【免费下载链接】label-studio 项目地址: https://gitcode.com/gh_mirrors/lab/label-studio 你是否曾经面对Label Studio的英文界面感到困惑&#xff1f;或者在团队协作中需要为不同地区的用户提供本地…

作者头像 李华