解决问题

解不等式方程。
形如\(x_i\le x_j+w\)
ps.等式可以化为两个不等式

解决方法。

相当于每条有向边松弛后的柿子。
所以跑最短路即可。
但有可能负权,而且要判无解(有负环)。
跑spfa即可

code

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int n, m, head[N], to[N], nxt[N], len[N], ecnt, cnt[N], dis[N];
bool In_s[N];
void add_edge(int u, int v, int w) {nxt[++ecnt] = head[u]; to[ecnt] = v; len[ecnt] = w; head[u] = ecnt;}
void spfa() {
	memset(dis, 0x3f, sizeof(dis));
	queue<int> Q;
	Q.push(0); dis[0] = 0;
	while(!Q.empty()) {
		int u = Q.front(); Q.pop();
		In_s[u] = 0;
		for(int i = head[u]; i; i = nxt[i]) {
			int v = to[i]; 
			if(dis[v] > dis[u] + len[i]) {
				dis[v] = dis[u] + len[i];
				if(!In_s[v]) {
					In_s[v] = 1, Q.push(v);
					if(++cnt[v] > n) {printf("NO"); exit(0);}
				}
			}
		}
	}
}
int main() {
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++) {add_edge(0, i, 0);}
	for(int i = 1; i <= m; i++) {
		int y, x, w;
		scanf("%d%d%d", &y, &x, &w);
		add_edge(x, y, w);
	}
	spfa();
	for(int i = 1; i <= n; i++) {
		printf("%d ", dis[i]);
	}
	return 0;
}