算法学习笔记(差分约束系统)
前置:spfa
从例题入手:
【模板】差分约束系统 | StarryCoding
题目描述
给定 n n n未知量和一个大小为 m m m的不等式(或等式)组,请你判断这个不等式(或等式)组是否有解。
1 1 1 i i i j j j z z z:表示 x i ≤ x j + z x_i \leq x_j + z xi≤xj+z
2 2 2 i i i j j j z z z:表示 x i ≥ x j + z x_i \geq x_j + z xi≥xj+z
3 3 3 i i i j j j:表示 x i = y j x_i = y_j xi=yj。
若存在解,输出 Y E S YES YES。
若不存在解,输出 N O NO NO。
输入描述
第一行一个整数 T T T表示样例个数。 ( 1 ≤ T ≤ 1000 ) (1 \leq T \leq 1000) (1≤T≤1000)
对于每组样例:
第一行两个整数 n , m n,m n,m。 ( 2 ≤ n ≤ 5 × 1 0 3 , 1 ≤ m ≤ 5 × 1 0 3 ) (2 \leq n \leq 5 \times 10^3,1 \leq m \leq 5 \times 10^3) (2≤n≤5×103,1≤m≤5×103)
接下来 m m m行,每行一个不等式组。 ( 1 ≤ i , j ≤ n , 1 ≤ z ≤ 1 0 7 ) (1 \leq i,j \leq n,1 \leq z \leq 10^7) (1≤i,j≤n,1≤z≤107)
数据保证 ∑ n ≤ 5 × 1 0 3 , ∑ m ≤ 1 0 4 \sum n \leq 5 \times 10^3, \sum m \leq 10^4 ∑n≤5×103,∑m≤104。
输出描述
对于每组样例,第一行输出 Y E S YES YES或 N O NO NO。
输入样例
23 3
1 1 2 3
1 1 3 3
2 1 3 43 3
1 1 2 3
1 1 3 3
2 1 3 3
输出样例
NO
YES
在我们的 s p f a spfa spfa中,当 d [ y ] > d [ x ] + w d[y] > d[x] + w d[y]>d[x]+w时,我们就会更新 d [ y ] d[y] d[y],换句话说,若存在一条边连接着点 x x x和 y y y,则 d [ y ] < = d [ x ] + w d[y] <= d[x] + w d[y]<=d[x]+w恒成立。而这个不等式就相当于题目中第一个不等式 x i ≤ x j + z x_i \leq x_j + z xi≤xj+z,这也就是差分约束的原理。
所以,对于 x i ≤ x j + z x_i \leq x_j + z xi≤xj+z,可以假定有一条权值为 z z z的边从点 j j j出发指向 i i i。
那具体如何判断所给不等式组是否有解?可以拟定一个虚拟源点 0 0 0,用边权为 0 0 0的边连到所有节点。然后从这个虚拟源点出发跑一遍最短路,若出现负环,则不等式组无解,因为出现负环时, 0 0 0到 i i i的距离比 0 0 0到 j j j的距离更远,用公式来讲就是 d [ i ] > d [ j ] + z d[i] > d[j] + z d[i]>d[j]+z即 x i > x j + z x_i > x_j + z xi>xj+z,不符合题意。
对于第二个不等式 x i ≥ x j + z x_i \geq x_j + z xi≥xj+z则变形为, x j ≤ x i − z x_j \leq x_i - z xj≤xi−z。
对于第三个式子 x i = y j x_i = y_j xi=yj,则在 x x x和 y y y之间建立一个边权为 0 0 0的双向边。
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 9;
using ll = long long;
const ll inf = 2e18;struct Edge
{int x;ll w;
};int n, m;
vector<Edge> g[N];
ll d[N];bool spfa(int st)
{//两行初始化,不要忘记for(int i = 1; i <= n; ++i) d[i] = inf;d[st] = 0;queue<int> q; //队列存储需要更新的点bitset<N> inq; //inq[i]表示第i个点在不在队列中q.push(st);vector<int> cnt(n + 1); //计数while(q.size()) {int x = q.front(); q.pop(); inq[x] = false;for(auto [y, w] : g[x]) //更新所有边{if(d[y] > d[x] + w) //如果能被更新,更新且入队{if(++ cnt[y] >= n) return true;d[y] = d[x] + w;if(!inq[y]){q.push(y);inq[y] = true;}}}}return false;
}void solve()
{cin >> n >> m;for(int i = 0; i <= n; ++i) g[i].clear();for(int i = 1; i <= m; ++i){int op, x, y; cin >> op >> x >> y;if(op == 1){ll w; cin >> w;g[y].push_back({x, w});}if(op == 2){ll w; cin >> w;g[x].push_back({y, -w});}if(op == 3){g[y].push_back({x, 0});g[x].push_back({y, 0});}}for(int i = 1; i <= n; ++i) g[0].push_back({i, 0});if(spfa(0)) cout << "NO" << '\n';else cout << "YES" << '\n';
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int _; cin >> _;while(_--) solve();return 0;
}
最后因为不等式组的解不唯一,输出时挑一个满足题意的解,只需要将距离数组 d d d输出即可。
相关文章:
算法学习笔记(差分约束系统)
前置:spfa 从例题入手: 【模板】差分约束系统 | StarryCoding 题目描述 给定 n n n未知量和一个大小为 m m m的不等式(或等式)组,请你判断这个不等式(或等式)组是否有解。 1 1 1 i i i j …...
HCIP的学习(14)
过滤策略—filter-policy 思科中:分发列表 过滤策略是只能够针对于路由信息进行筛选(过滤)的工具,而无法针对于LSA进行过滤。 在R4的出方向上配置过滤策略,使得R1不能学习到23.0.0.0/24路由信息1、抓取流量 […...
行业新应用:电机驱动将成为机器人的动力核心
电机已经遍布当今社会人们生活的方方面面,不仅应用范围越来越广,更新换代的速度也日益加快。按照工作电源分类,可以将它划分为直流电机和交流电机两大类型。直流电机中,按照线圈类型分类,又可以分为有铁芯的电机、空心…...
大模型模型简化机器人训练;简单易用的 3D 工具Project Neo;特斯拉放出了擎天柱机器人最新训练视频
✨ 1: DrEureka 利用大语言模型自动化将机器人仿真环境训练结果转移到真实世界 DrEureka是一种利用大型语言模型(LLMs)自动化和加速从仿真(sim)到现实世界(real)转移的技术。在机器人技能学习领域&#x…...
Win11安装Docker Desktop运行Oracle 11g 【详细版】
oracle docker版本安装教程 步骤拉取镜像运行镜像进入数据库配置连接数据库,修改密码Navicat连接数据库 步骤 拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g运行镜像 docker run -d -p 1521:1521 --name oracle11g registry.cn-ha…...
分布式事务?哪几种方式实现?一文看懂!
什么是分布式事务 分布式事务是指在分布式系统中涉及到多个数据库或多个应用程序之间的事务处理,这些数据库或应用程序可能分布在不同的物理节点上,甚至可能位于不同的地理位置。在分布式事务中,需要确保所有参与者的事务操作都能够保持一致性…...
词令蚂蚁庄园今日答案如何在微信小程序查看蚂蚁庄园今天问题的正确答案?
词令蚂蚁庄园今日答案如何在微信小程序查看蚂蚁庄园今天问题的正确答案? 1、打开微信,点击搜索框; 2、打开搜索页面,选择小程序搜索; 3、在搜索框,输入词令搜索点击进入词令微信小程序; 4、打开…...
【Delphi 爬虫库 6】使用正则表达式提取猫眼电影排行榜top100
正则表达式库的简单介绍 正则表达式易于使用,功能强大,可用于复杂的搜索和替换以及基于模板的文本检查。这对于输入形式的用户输入验证特别有用-验证电子邮件地址等。您还可以从网页或文档中提取电话号码,邮政编码等,在日志文件中…...
Markdown和Latex中文字上下标的方法
技术背景 在Markdown和Latex中,如果只是写公式,不论是行内公式还是行间公式,都可以直接使用^和_这两个符号实现上下标。但有个问题是,如果只是使用公式来做上下标,出来的字体是斜着的。例如这样的语法: $$ …...
VSCode:设置顶部文件标签页滚动条的宽度
使用VSCode打开多个文件后,顶部的文件标签可以通过滚动条进行滚动,但是缺点是该滚动条太窄了,不好选择。 可以通过如下方法修改改滚动条的宽度: 1.点击设置 2.选择工作台->编辑管理->Title Scrollbar Sizing->Large 3.可…...
MySQL变量的定义与使用
# 关系运算 select x < y as 大小判断;# 返回结果1代表true,如果是0代表false select x > y; # 逻辑运算 select TRUE and FALSE;# 依然符合&(and)与、|(or)或、^(xor)亦或。 select …...
python-pytorch seq2seq+attention笔记0.5.00
python-pytorch seq2seq+attention笔记0.5.00 1. LSTM模型的数据size2. 关于LSTM的输入数据包含hn和cn时,hn和cn的size3. LSTM参数中默认batch_first4. Attention机制的三种算法5. 模型的编码器6. 模型的解码器7. 最终模型8. 数据的准备9. 遇到的问题10. 完整代码1. LSTM模型的…...
ansible 深入介绍之 主机清单与playbook
目录 一 inventory 主机清单 1,主机清单 是什么 2,主机清单 定义方式 2.1 自定义主机端口 2.2 定义 范围ip 地址 2.3 定义 拥有相似的主机名 3, inventory 中的变量 3.1 常见 变量 3.2 主机变量 3.3 组变量 3.…...
【MySQ】9.构建高可用数据库:MySQL集群模式部署大全
单个MySQL节点的主要风险在于它构成了一个单点故障,这意味着任何硬件故障、软件崩溃或维护需求都可能导致整个数据库服务中断,从而影响到业务的连续性和数据的安全性。此外,它还限制了系统的扩展性,使得性能提升和负载均衡变得困难…...
Leedcode题目:移除链表元素
题目: 这个题目就是要我们将我们的链表中的值是val的节点删除。 我们题目提供的接口是 传入了指向一个链表的第一个节点的指针,和我们要删除的元素的值val,不只要删除第一个, 思路 我们这里可以创建一个新的链表,…...
1_1. Linux简介
1_1. Linux简介 文章目录 1_1. Linux简介1. 我们用linux来干嘛2. 计算机组成3. 操作系统4. Linux哲学思想5. Linux目录6. Linux分区类型 1. 我们用linux来干嘛 1. 大家都知道linux是一个操作系统,它是一个基础的软件,操作系统是硬件与应用程序的中间层。…...
Swift 函数
函数 一、函数的定义与调用二、函数参数与返回值1、无参数函数2、多参数函数3、无返回值函数4、多重返回值函数5、可选元组返回类型6、隐式返回的函数 三、函数参数标签和参数名称1、指定参数标签2、忽略参数标签3、默认参数值4、可变参数5、输入输出参数 四、函数类型1、使用函…...
QT creator qt6.0 使用msvc2019 64bit编译报错
qt creator qt6.0报错: D:\Qt6\6.3.0\msvc2019_64\include\QtCore\qglobal.h:123: error: C1189: #error: "Qt requires a C17 compiler, and a suitable value for __cplusplus. On MSVC, you must pass the /Zc:__cplusplus option to the compiler."…...
scrapy常用命令总结
1.创建scrapy项目的命令: scrapy startproject <项目名字> 示例: scrapy startproject myspider 2.通过命令创建出爬虫文件,爬虫文件为主要的代码文件,通常一个网站的爬取动作都会在爬虫文件中进行编写。 …...
【Linux系列】file命令
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
MPO光纤跳线:从结构解析到数据中心高密度布线实战
1. MPO光纤跳线:高密度布线的秘密武器 第一次接触MPO光纤跳线时,我被它的"小身材大容量"震惊了。这个看起来和普通SC连接器差不多大小的家伙,居然能塞下12根甚至24根光纤!这就像在普通U盘大小的空间里装下了整个移动硬盘…...
2026最新大模型应用开发学习路线(附时间规划,小白/程序员必收藏)
一、先破局:初学者必看!Python 还是 Java 选对不踩坑 很多小白和入门程序员,刚接触大模型开发就卡在编程语言选择上,浪费大量时间纠结。不绕弯子,直接给结论,结合AI开发场景帮你精准选择,新手直…...
TripoSR:0.5秒单图像3D重建技术指南与实战应用
TripoSR:0.5秒单图像3D重建技术指南与实战应用 【免费下载链接】TripoSR 项目地址: https://gitcode.com/GitHub_Trending/tr/TripoSR 在3D内容创作领域,传统建模流程耗时耗力,而TripoSR作为开源3D重建模型,通过单张2D图像…...
终极指南:如何在PC上免费畅玩Switch游戏 - Ryujinx模拟器完整解决方案
终极指南:如何在PC上免费畅玩Switch游戏 - Ryujinx模拟器完整解决方案 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 你是否曾经梦想在电脑上体验《塞尔达传说:…...
隐私优先方案:OpenClaw+Qwen3-32B-RTX4090D离线处理医疗记录
隐私优先方案:OpenClawQwen3-32B-RTX4090D离线处理医疗记录 1. 为什么医疗数据必须留在本地? 去年协助某诊所搭建病历管理系统时,我亲历了一次数据泄露恐慌。当诊所负责人发现云端OCR服务商要求上传患者检查报告时,他立即叫停了…...
避坑指南:在ESXi或Proxmox VE虚拟化平台下配置Intel I350网卡直通与PXE启动
虚拟化环境下的Intel I350网卡直通与PXE启动全流程解析 在虚拟化技术日益普及的今天,企业级用户经常面临将物理网卡直通给虚拟机并实现PXE网络启动的需求。Intel I350系列网卡以其稳定性和高性能成为众多虚拟化平台的首选,但在ESXi和Proxmox VE等环境中…...
墨语灵犀效果展示:康沃尔语复兴运动口号→中文新文化运动风格译文
墨语灵犀效果展示:康沃尔语复兴运动口号→中文新文化运动风格译文 1. 翻译效果惊艳呈现 墨语灵犀作为一款融合古典美学与现代AI技术的深度翻译工具,在语言转换过程中展现出令人惊叹的文化适应能力。本次展示以康沃尔语复兴运动口号为源文本,…...
终极指南:如何轻松解包Godot PCK文件并提取游戏资源
终极指南:如何轻松解包Godot PCK文件并提取游戏资源 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 还在为Godot游戏的PCK文件无法解包而烦恼吗?无论你是游戏开发者想要复用资…...
记录模式到底要不要在Spring Boot中落地?阿里、蚂蚁内部技术委员会最新评估报告曝光,87%团队已启动灰度迁移
第一章:记录模式在Spring Boot生态中的战略定位与演进脉络 记录模式(Recording Mode)并非Spring Boot官方术语,而是社区对一类以“可观测性前置”为核心理念的设计范式所形成的共识性称谓——它强调在应用生命周期早期即注入结构化…...
基于迁移学习的口罩检测模型优化
基于迁移学习的口罩检测模型优化 1. 引言 口罩检测作为计算机视觉领域的一个重要应用场景,在实际部署中常常面临数据量不足、训练成本高、模型泛化能力弱等问题。传统从零开始训练检测模型需要大量标注数据和计算资源,而迁移学习技术能够有效解决这些痛…...
