题目地址:
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′​​≤y1​xc2​​−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 【模板】差分约束算法相关推荐

  1. 解题报告:P5960 【模板】差分约束算法(及常用技巧)

    P5960 [模板]差分约束算法 差分约束系统 给出 n 个变量和 m 个约束条件,形如 xi−xj≤ckx_i - x_j \leq c_kxi​−xj​≤ck​,你需要求出一组解,使得所有约束条件 ...

  2. 【模板】差分约束算法

    [模板]差分约束算法 题意: 题解: 模板题 算法讲解 给出一组包含 m 个不等式,有 n 个未知数.求任意一组满足这个不等式组的解,或判定无解. 连边之后跑最短路,保证每个连通块都没有负环即可. 也 ...

  3. 洛谷or牛客数据结构+算法

    栈思想:先进后出 tips:栈里能放下标就放下标 (牛客)小c的计事本(直接用stack可以简化代码,且不会被自己绕晕,当时没意识到) (牛客)吐泡泡(没意识到用栈),(牛客)好串 1.后缀表达式(栈 ...

  4. 【图论】差分约束算法详解

    一.前言 在介绍差分约束之前,我们首先需要知道差分约束是用来解决什么问题的:差分约束是一个用来解决形如 X<=Y+c 的二元不等式组的可行解的一个算法.在高中数学中我们会学习如何使用线性规划的方 ...

  5. 洛谷OJ:P5960 【模板】差分约束算法

    思路:差分约束模板题,注意使用SPFA来判断负环,也即无解的情况. #include<queue> #include<vector> #include<string> ...

  6. 专题·树链剖分【including 洛谷·【模板】树链剖分

    初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...

  7. 洛谷·【模板】点分树 | 震波【including 点分树

    初见安-这里是传送门:洛谷P6329 [模板]点分树 | 震波 一.点分树 其实你会点分治的话,点分树就是把点分治时的重心提出来重新连城一棵树. 比如当前点是u,求出子树v的重心root后将root与 ...

  8. 【后缀数组】洛谷P3809模板题

    题目背景 这是一道模板题. 题目描述 读入一个长度为 n n n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...

  9. 洛谷.4897.[模板]最小割树(Dinic)

    题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...

  10. 强连通分量:洛谷P3387 模板:缩点

    传送门 顾名思义,模板awa #include <cstdio> #include <cstring> #include <cmath> #include < ...

最新文章

  1. rabbitmq中的三种交换器(匹配模式)
  2. C#机器学习插件 ---- AForge.NET
  3. mysql1401错误_mysql错误代号-I(1401~1450)
  4. Eclipse新建web项目出现The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path
  5. what happens if PR_TYPE is mapped to a given transaction type
  6. ​Cookie 从入门到进阶:一文彻底弄懂其原理以及应用
  7. 【九】Git 可视化GUI管理工具 - SourceTree
  8. 什么是处理机的态?为什么要区分处理机的态?
  9. python list 切片 复杂度_彻底理解Python list切片原理
  10. 《计算机系统:系统架构与操作系统的高度集成》——1.5 计算机硬件的演化...
  11. 使用SSMS将excel导入到sqlserver
  12. 网站运营活动策划方案模板
  13. java实现有限自动机_Java 实现一个非确定性有限自动机(NFA)
  14. mysql lpad 列_mysql的lpad函数
  15. ubuntu安装搜狗拼音输入法及安装后没有中文解决办法
  16. winrar v3.8 的注册码
  17. ZeroClipboard2跨浏览器复制粘贴
  18. 机器学习(ML)中文视频教程
  19. BZOJ 1124 [POI2008]枪战Maf 贪心+乱搞
  20. 计算机音乐数字乐谱童话,童话钢琴简谱-数字双手-光良

热门文章

  1. 拉卡拉考拉超收,关于它的全部信息!
  2. 来电铃声播放流程总结
  3. 达梦sql优化实践5
  4. protobuf 中 repeated fields 细节
  5. 白马非马----继承
  6. 自然语言处理-英文文本 python
  7. 面试被问“你未来的职业规划是什么”,怎样回答最完美?
  8. TI毫米波雷达开发中软件版本的说明
  9. 如何使用CubeMx生成一个DFU工程
  10. 数据库04—约束条件