Floyd

f[k][x][y] 表示只经过 的情况下, 的最短距离。初始化 f[0] 时,如果两个点一样,则距离为 ,否则为

for (k = 1; k <= n; k++) {
    for (x = 1; x <= n; x++) {
        for (y = 1; y <= n; y++) {
            f[x][y] = min(f[x][y], f[x][k] + f[k][y]);
        }
    }
}

差分约束

先从 向每个点连一条权值为 的边。每个条件是 ,相应地从 连一条长度为 的有向边。跑 Bellman-Ford,则 就是 可能的一个解。