题目
题解
差分约束, 就是一堆不等式, 最后求个最短/长路,
要保证存在 i 和 i + 1的约束((dis_{i+1} - dis_i > = 0)), 不要忘了题目的默认约束
也不要忘了保证图联通, 用超级源点S, 把所有点连起来
这就是为啥 洛谷最后三个点的意义
bool dfs(int x) {
v[x] = 1;
for (int i = h[x]; i; i = ne[i]) {
int y = to[i];
if (d[y] > d[x] + co[i]) {
d[y] = d[x] + co[i];
if (v[y] || dfs(y)) return 1;
}
}
v[x] = 0;
return 0;
}
int main() {
IOS; cin >> n >> m >> k; add(0, 1, 0);
rep (i, 2, n) d[i] = 1e18, add(i, i - 1, 0), add(0, i, 0);
rep (i, 1, m) {
int u, v, c; cin >> u >> v >> c;
add(u, v, c);
}
rep (i, 1, k) {
int u, v, c; cin >> v >> u >> c;
add(u, v, -c);
}
if (dfs(0)) { cout << -1; return 0; }
rep (i, 1, n) d[i] = 1e18, v[i] = 0; d[1] = 0; dfs(1);
cout << (d[n] == 1e18 ? -2 : d[n]);
return 0;
}