算法学习笔记(差分约束系统)
前置: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 的首页,持续学…...

基于php+mysql+html简单图书管理系统
博主介绍: 大家好,本人精通Java、Python、Php、C#、C、C编程语言,同时也熟练掌握微信小程序、Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...

【Python系列】Python中列表属性提取
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

使用MATLAB/Simulink点亮STM32开发板LED灯
使用MATLAB/Simulink点亮STM32开发板LED灯-笔记 一、STM32CubeMX新建工程二、Simulink 新建工程三、MDK导入生成的代码 一、STM32CubeMX新建工程 1. 打开 STM32CubeMX 软件,点击“新建工程”,选择中对应的型号 2. RCC 设置,选择 HSE(外部高…...

HDFS- DataNode磁盘扩缩容
HDFS- DataNode磁盘扩缩容 背景: 缩减/增加节点磁盘 方案介绍: 采用hdfs dfsadmin -reconfig 动态刷新配置实现,不停服扩缩容。 注意事项: 请在进行缩容之前,务必了解实际的数据量,并确保磁盘有足够的空间来容纳这些数据。还需要考虑未来的使用需求,要预留一定数量的空间…...

5.10.3 使用 Transformer 进行端到端对象检测(DETR)
框架的主要成分称为 DEtection TRansformer 或 DETR,是基于集合的全局损失,它通过二分匹配强制进行独特的预测,以及 Transformer 编码器-解码器架构。 DETR 会推理对象与全局图像上下文的关系,以直接并行输出最终的预测集。 1. …...

前端开发指导
前端开发指导 本文介绍了配置前端开发环境需要的软件、配置项等,指导如何开始进行UDM部门前端开发的全流程。本文以Windows系统下在Microsoft Virtual Studio Code中开发为基础。 一、综述 目标:零基础或者新员工依照此文档,能够完成开发环境的搭建及熟悉测试环境的搭建。…...
三方库的调用方法
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言三方库的调用方法1. **下载并安装Boost库(三方库)**2. **配置开发环境**3. **包含Boost(三方库)头文件**4. **编写代码**5. **链接Boost库(三…...

如何使用提示测试为LLMs构建单元测试?
原文地址:how-to-build-unit-tests-for-llms-using-prompt-testing 确保您的人工智能交付:快速测试完美生成应用程序的基本指南 2024 年 4 月 26 日 如果你曾经编写过软件,你就会知道测试是开发过程中必不可少的一部分。特别是单元测试&#…...

目前市面上堡垒机厂家有哪些?会帮忙部署吗?
随着大家对于网络安全的重视,越来越多的企业准备采购堡垒机了。不少企业在问,目前市面上堡垒机厂家有哪些?会帮忙部署吗?这里我们小编就来简单为大家回答一下,仅供参考哈! 目前市面上堡垒机厂家有哪些&…...
【备忘】在使用php-ffmpeg/php-ffmpeg开发时遇到Unable to load FFProbe时如何处理?
执行FFProbe::create()时,提示Unable to load FFProbe,php-ffmpeg/php-ffmpeg版本是用的^0.19.0,安装位置/usr/bin/ffprobe,现在提示这个错误要怎么解决呢 说个小技巧: 当在开发跟视频相关的功能时,总是出…...