【模板】差分约束

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

{xc1xc1y1xc2xc2y2xcmxcmym

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

输入格式

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

接下来 m 行,每行包含三个整数 c,c,y,代表一个不等式 xcxcy

数据范围

对于 100% 的数据,1n,m5×103104y1041c,cncc

#define MAXN 5005 #define MAXM 10005 using namespace std; int read() { int ans = 0, sgn = 1; char c = getchar(); while (!isdigit(c)) { if (c == '-') sgn *= -1; c = getchar(); } while (isdigit(c)) { ans = ans * 10 + c - '0'; c = getchar(); } return ans * sgn; } int cnt_edge, head[MAXN]; struct { int to, next, w; } edges[MAXM]; void add_edge(int from, int to, int w) { edges[++cnt_edge].next = head[from]; edges[cnt_edge].to = to; edges[cnt_edge].w = w; head[from] = cnt_edge; } bool inqueue[MAXN]; int cnt[MAXN], dis[MAXN]; queue<int> Q; bool SPFA(int s, int n) { memset(dis, 127, sizeof(dis)); // memset(dis, -127, sizeof(dis)); dis[s] = 0; Q.push(s); while (!Q.empty()) { int p = Q.front(); if (cnt[p] > n) return false; Q.pop(); inqueue[p] = false; for (int eg = head[p]; eg != 0; eg = edges[eg].next) { int to = edges[eg].to; if (edges[eg].w + dis[p] < dis[to]) // if (edges[eg].w + dis[p] > dis[to]) { dis[to] = edges[eg].w + dis[p]; if (!inqueue[to]) { Q.push(to); inqueue[to] = true; cnt[to]++; } } } } return true; } int main() { int n = read(), m = read(); for (int i = 0; i < m; ++i) { int x = read(), y = read(), w = read(); add_edge(y, x, w); // add_edge(x, y, -w); } for (int i = 1; i <= n; ++i) add_edge(0, i, 0); if (SPFA(0, n)) { for (int i = 1; i <= n; ++i) printf("%d ", dis[i]); } else puts("NO"); return 0; }

__EOF__

本文作者爱飞鱼
本文链接https://www.cnblogs.com/mathiter/p/17892119.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   potential-star  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示