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

《P5960 【模板】差分约束》

题目描述

给出一组包含 m 个不等式,有 n 个未知数的形如:

⎩⎨⎧​xc1​​−xc1′​​≤y1​xc2​​−xc2′​​≤y2​⋯xcm​​−xcm′​​≤ym​​

的不等式组,求任意一组满足这个不等式组的解。

输入格式

第一行为两个正整数 n,m,代表未知数的数量和不等式的数量。

接下来 m 行,每行包含三个整数 c,c′,y,代表一个不等式 xc​−xc′​≤y。

输出格式

一行,n 个数,表示 x1​,x2​⋯xn​ 的一组可行解,如果有多组解,请输出任意一组,无解请输出 NO

输入输出样例

输入 #1复制

3 3
1 2 3
2 3 -2
1 3 1

输出 #1复制

5 3 5

说明/提示

样例解释

⎩⎨⎧​x1​−x2​≤3x2​−x3​≤−2x1​−x3​≤1​

一种可行的方法是 x1​=5,x2​=3,x3​=5。

⎩⎨⎧​5−3=2≤33−5=−2≤−25−5=0≤1​

数据范围

对于 100% 的数据,1≤n,m≤5×103,−104≤y≤104,1≤c,c′≤n,c=c′。

评分策略

你的答案符合该不等式组即可得分,请确保你的答案中的数据在 int 范围内。

如果并没有答案,而你的程序给出了答案,SPJ 会给出 There is no answer, but you gave it,结果为 WA;
如果并没有答案,而你的程序输出了 NO,SPJ 会给出 No answer,结果为 AC;
如果存在答案,而你的答案错误,SPJ 会给出 Wrong answer,结果为 WA;
如果存在答案,且你的答案正确,SPJ 会给出 The answer is correct,结果为 AC。

代码实现:

#include <stdio.h>
#include <bits/stdc++.h>

using namespace std;

int numVars, numConstraints, edgeIdx, head[5005], dist[5005], cnt[5005];
bool inQueue[5005];

struct Edge {
int to, val, next;
} edges[10005];

queue<int> q;

void addEdge(int u, int v, int w) {
edges[++edgeIdx].to = v;
edges[edgeIdx].val = w;
edges[edgeIdx].next = head[u];
head[u] = edgeIdx;
}

bool spfa(int start) {
dist[start] = 0;
q.push(start);
inQueue[start] = true;
cnt[start]++;
while (!q.empty()) {
int u = q.front();
q.pop();
inQueue[u] = false;
for (int i = head[u]; i != 0; i = edges[i].next)
if (dist[edges[i].to] > dist[u] + edges[i].val) {
dist[edges[i].to] = dist[u] + edges[i].val;
if (!inQueue[edges[i].to]) {
q.push(edges[i].to);
inQueue[edges[i].to] = true;
cnt[edges[i].to]++;
if (cnt[edges[i].to] == numVars + 1) return false;
}
}
}
return true;
}

int main() {
scanf("%d %d", &numVars, &numConstraints);
for (int i = 1; i <= numVars; i++)
dist[i] = INT_MAX;
for (int i = 1; i <= numConstraints; i++) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
addEdge(v, u, w);
}
for (int i = 1; i <= numVars; i++)
addEdge(numVars + 1, i, 0);
if (!spfa(numVars + 1)) {
printf("NO");
return 0;
}
for (int i = 1; i <= numVars; i++)
printf("%d ", dist[i]);
return 0;
}

http://www.dtcms.com/a/304301.html

相关文章:

  • LeetCode Hot 100:11. 盛最多水的容器
  • Vulnhub 02-Breakout靶机渗透攻略详解
  • 牛顿拉夫逊法PQ分解法计算潮流MATLAB程序计算模型。
  • 【AI论文】Yume:一种交互式世界生成模型
  • Docker网络技术深度研究与实战手册
  • C++与C#实战:FFmpeg屏幕录制开发指南
  • 2025年KBS顶刊新算法-向光优化算法Phototropic growth algorithm-附Matlab免费代码
  • 从线下挂号到全流程智能问诊:智慧医院APP源码开发指南
  • MATLAB弹塑性固体有限元计算程序
  • 【LGR-234-Div.3】洛谷网校 7 月 CSP-J 模拟月赛 Cfz Round 6 「Cfz Round 6」Imaichi
  • 【PHP】通过IP获取IP所在地理位置(免费API接口)
  • Kruskal算法
  • gTest测试框架的安装与配置
  • HammerDB:一款免费开源的数据库基准测试工具
  • YOLOv11.pt 模型转换为 TFLite 和 NCNN 模型
  • PDF转Word免费工具!批量处理PDF压缩,合并, OCR识别, 去水印, 签名等全功能详解
  • CodeRush AI 助手进驻 Visual Studio:AiGen/AiFind 亮相(三)
  • Visual Studio的妙用
  • [极客大挑战 2019]FinalSQL
  • 如何查询并访问路由器的默认网关(IP地址)?
  • 大规模矩阵构建与高级算法应用
  • Unity 编辑器开发 之 Excel导表工具
  • Python爬虫01_Requests第一血获取响应数据
  • 香橙派One安装OctoPrint 实现控制3D打印机
  • WebRTC 2025全解析:从技术原理到商业落地
  • 容器技术原理(一):从根本上认识容器镜像
  • Linux boot 目录损坏如何修复:从救援模式到系统恢复
  • APK重打包流程
  • K8s集群两者不同的对外暴露服务的方式
  • 如何迁移gitlab到另一台服务器