【洛谷】P5960 【模板】差分约束算法
题目地址:
https://www.luogu.com.cn/problem/P5960
题目描述:
给出一组包含mmm个不等式,有nnn个未知数的形如:{xc1−xc1′≤y1xc2−xc2′≤y2⋯xcm−xcm′≤ym\begin{cases} x_{c_1}-x_{c'_1}\leq y_1 \\x_{c_2}-x_{c'_2} \leq y_2 \\ \cdots\\ x_{c_m} - x_{c'_m}\leq y_m\end{cases}⎩⎪⎪⎪⎨⎪⎪⎪⎧xc1−xc1′≤y1xc2−xc2′≤y2⋯xcm−xcm′≤ym的不等式组,求任意一组满足这个不等式组的解。
输入格式:
第一行为两个正整数n,mn,mn,m,代表未知数的数量和不等式的数量。
接下来mmm行,每行包含三个整数c,c′,yc,c',yc,c′,y,代表一个不等式xc−xc′≤yx_c-x_{c'}\leq yxc−xc′≤y。
输出格式:
一行,nnn个数,表示x1,x2⋯xnx_1 , x_2 \cdots x_nx1,x2⋯xn的一组可行解,如果有多组解,请输出任意一组,无解请输出NO
。
数据范围:
对于 100%100\%100% 的数据,1≤n,m≤5×1031\leq n,m \leq 5\times 10^31≤n,m≤5×103,−104≤y≤104-10^4\leq y\leq 10^4−104≤y≤104,1≤c,c′≤n1\leq c,c'\leq n1≤c,c′≤n,c≠c′c \neq c'c=c′。
可以把差分约束问题转化为求有向图的单源最短路问题。考虑nnn个点1∼n1\sim n1∼n,想象有一个超级源点000,设xix_ixi是000到iii的最短路长度。对于所有形如xci−xci′≤li,1≤i≤mx_{c_i}-x_{c'_i}\le l_i,1\le i\le mxci−xci′≤li,1≤i≤m的方程,我们可以在建图的时候将ci′c'_ici′向cic_ici连一条长为lil_ili的有向边,并且从000向每一个1∼n1\sim n1∼n的点连一条长000的有向边,那么对于这个图,如果不存在负环的话,可以求出以000为源点的单源最短路长度ddd,即d[i]d[i]d[i]是000到iii的最短路长度,那么这个ddd数组就是原来的差分约束的一组解;如果存在负环的话,说明无解。由于图中有负权边,所以要用SPFA来求最短路。代码如下:
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;const int N = 5010, M = N;
int n, m;
int h[N], e[M], ne[M], w[M], idx;
// cnt[i]是超级源点0到i的最短路边数,不包含0出发的那条边
int dist[N], cnt[N];
bool vis[N];void add(int a, int b, int c) {e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}// 返回是否能求出单源最短路
bool spfa() {queue<int> q;// 不显式建立0到每个点的边,而是直接将每个点入队for (int i = 1; i <= n; i++) {q.push(i);vis[i] = true;}while (q.size()) {int t = q.front(); q.pop();vis[t] = false;for (int i = h[t]; ~i; i = ne[i]) {int v = e[i];if (dist[v] > dist[t] + w[i]) {dist[v] = dist[t] + w[i];cnt[v] = cnt[t] + 1;// 如果某个点的最短路边数大于n - 1,说明存在负环,返回falseif (cnt[v] > n - 1) return false;if (!vis[v]) {q.push(v);vis[v] = true;}}}}return true;
}int main() {memset(h, -1, sizeof h);scanf("%d%d", &n, &m);for (int i = 1; i <= m; i++) {int a, b, c;scanf("%d%d%d", &a, &b, &c);add(b, a, c);}bool found = spfa();if (!found) puts("NO");else for (int i = 1; i <= n; i++) printf("%d ", dist[i]);
}
时间复杂度O(nm)O(nm)O(nm),空间O(n)O(n)O(n)。
【洛谷】P5960 【模板】差分约束算法相关推荐
- 解题报告:P5960 【模板】差分约束算法(及常用技巧)
P5960 [模板]差分约束算法 差分约束系统 给出 n 个变量和 m 个约束条件,形如 xi−xj≤ckx_i - x_j \leq c_kxi−xj≤ck,你需要求出一组解,使得所有约束条件 ...
- 【模板】差分约束算法
[模板]差分约束算法 题意: 题解: 模板题 算法讲解 给出一组包含 m 个不等式,有 n 个未知数.求任意一组满足这个不等式组的解,或判定无解. 连边之后跑最短路,保证每个连通块都没有负环即可. 也 ...
- 洛谷or牛客数据结构+算法
栈思想:先进后出 tips:栈里能放下标就放下标 (牛客)小c的计事本(直接用stack可以简化代码,且不会被自己绕晕,当时没意识到) (牛客)吐泡泡(没意识到用栈),(牛客)好串 1.后缀表达式(栈 ...
- 【图论】差分约束算法详解
一.前言 在介绍差分约束之前,我们首先需要知道差分约束是用来解决什么问题的:差分约束是一个用来解决形如 X<=Y+c 的二元不等式组的可行解的一个算法.在高中数学中我们会学习如何使用线性规划的方 ...
- 洛谷OJ:P5960 【模板】差分约束算法
思路:差分约束模板题,注意使用SPFA来判断负环,也即无解的情况. #include<queue> #include<vector> #include<string> ...
- 专题·树链剖分【including 洛谷·【模板】树链剖分
初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...
- 洛谷·【模板】点分树 | 震波【including 点分树
初见安-这里是传送门:洛谷P6329 [模板]点分树 | 震波 一.点分树 其实你会点分治的话,点分树就是把点分治时的重心提出来重新连城一棵树. 比如当前点是u,求出子树v的重心root后将root与 ...
- 【后缀数组】洛谷P3809模板题
题目背景 这是一道模板题. 题目描述 读入一个长度为 n n n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...
- 洛谷.4897.[模板]最小割树(Dinic)
题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...
- 强连通分量:洛谷P3387 模板:缩点
传送门 顾名思义,模板awa #include <cstdio> #include <cstring> #include <cmath> #include < ...
最新文章
- rabbitmq中的三种交换器(匹配模式)
- C#机器学习插件 ---- AForge.NET
- mysql1401错误_mysql错误代号-I(1401~1450)
- Eclipse新建web项目出现The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path
- what happens if PR_TYPE is mapped to a given transaction type
- ​Cookie 从入门到进阶:一文彻底弄懂其原理以及应用
- 【九】Git 可视化GUI管理工具 - SourceTree
- 什么是处理机的态?为什么要区分处理机的态?
- python list 切片 复杂度_彻底理解Python list切片原理
- 《计算机系统:系统架构与操作系统的高度集成》——1.5 计算机硬件的演化...
- 使用SSMS将excel导入到sqlserver
- 网站运营活动策划方案模板
- java实现有限自动机_Java 实现一个非确定性有限自动机(NFA)
- mysql lpad 列_mysql的lpad函数
- ubuntu安装搜狗拼音输入法及安装后没有中文解决办法
- winrar v3.8 的注册码
- ZeroClipboard2跨浏览器复制粘贴
- 机器学习(ML)中文视频教程
- BZOJ 1124 [POI2008]枪战Maf 贪心+乱搞
- 计算机音乐数字乐谱童话,童话钢琴简谱-数字双手-光良