[USACO05DEC]Layout G

题目

点我过去看

题解

差分约束, 就是一堆不等式, 最后求个最短/长路,

要保证存在 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;
}
posted @ 2020-11-30 17:29  洛绫璃  阅读(102)  评论(0编辑  收藏  举报