Floyd Warshall

fn floyd_warshall(adj: &Vec<Vec<i64>>, inf: i64) -> Vec<Vec<i64>> {
    // dp[k][u][v] = minimum distance from u to v using vertices 0..=k as intermediate
    // dp[-1][u][v] = adj[u][v]
    // dp[k][u][v] = min(dp[k - 1][u][v], dp[k - 1][u][k] + dp[k - 1][k][v]);
    // adj[u][u] is usally 0. Remember to check it.
    let n = adj.len();
    let mut dp = adj.clone();
    for k in 0..n {
        for u in 0..n {
            for v in 0..n {
                if dp[u][k] != inf && dp[k][v] != inf {
                    dp[u][v] = dp[u][v].min(dp[u][k] + dp[k][v]);
                }
            }
        }
    }
    dp
}

The dp can be updated in [{ O(n^2) }] when the weight of an edge decreased to w:

let dis = floyd_warshall(&adj, inf);
dis[u][v] = w; // (u, v) decreases to w
for s in 0..n {
    for t in 0..n {
        if dis[s][u] != inf && dis[v][t] != inf {
            dis[s][t] = dis[s][t].min(dis[s][u] + dis[u][v] + dis[v][t]);
        }
    }
}

Problem List: