当前位置: 首页 > news >正文

洛谷 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; }
http://www.cnnetsun.cn/news/102618.html

相关文章:

  • Python中append()方法的使用、原理及效率解析
  • 评管理信息系统教材:过时问题、理论实践结合及专业适配性
  • 生产执行系统怎么选?2025年制造业高性价比MES系统推荐
  • MuJoCo逆向运动学实战:从理论到人形机器人运动重定向的完整指南
  • 降aigc提示词排名:10大工具+高效推荐
  • Obsidian Linter完整使用指南:让你的笔记格式统一专业
  • 理工科标题规范:8大平台+工具示例排名
  • 揭秘Vanna:用自然语言解锁数据库查询的AI黑科技
  • BDInfo终极指南:10分钟掌握蓝光光盘信息分析技巧
  • Tkinter Helper终极指南:5分钟学会可视化GUI界面开发
  • 基于Gradle8.0的插件开发
  • Gradle8.0中Transform的替代方案
  • 47、运维脚本与消息推送:从菜单到弹窗的全面指南
  • 50、脚本与函数的综合应用指南
  • XDM浏览器插件终极指南:5分钟快速上手高速下载神器
  • 如何配置一个!P地址和子网掩码?
  • EmotiVoice项目依赖项精简计划:降低部署复杂度
  • 魔盒项目开发纪实:移动端应用开发
  • 鸿蒙ArkTS与Vue3状态管理对比
  • EmotiVoice能否生成辩论赛语音?逻辑性强语调输出
  • 【必收藏】AI智能体(AI Agent)完全指南:从底层原理到落地实践,打造你的第一个智能体系统
  • 建议收藏:零基础也能玩转AI大模型:提示词工程+微调+RAG实战指南
  • 精度论文:【Class Attention Transfer Based Knowledge Distillation】
  • 邮件防泄露再升级!CACTER EDLP大模型破解隐秘泄露,防护更精准
  • 13、深入了解psad:端口扫描攻击检测器与可疑流量检测
  • affine+docker+postgresql+备份数据库
  • EmotiVoice语音风格迁移功能探索:跨语境情感复现
  • FDM 3D打印表面粗糙度降至2μm?这一新技术来了解一下!
  • EmotiVoice跨平台兼容性测试结果公布
  • EmotiVoice支持长文本输入吗?分段处理最佳实践