ワーシャルフロイド法

概要

全ての頂点の組の最短距離が求められる.

計算量

頂点数を$V$とすると$O(V^3)$.

注意

行列でグラフを表現するが,同じ頂点同士の距離は0,辺が存在しない場合は距離を$\infty$とする.

ソースコード

/*
Gは隣接行列である必要があり,辺がない場合はINF,自己ループ辺は0
*/
const long INF = 1e17;

vector<vector<long>> floydWarshall(vector<vector<long>> &G){
    const int N = G.size();
    auto H = G;
    for(int a=0;a<N;a++){
        for(int b=0;b<N;b++){
            for(int c=0;c<N;c++){
                long d = H[b][a] + H[a][c];
                if(H[b][a]==INF||H[a][c]==INF)d = INF;
                if(H[b][c] > d){
                    H[b][c] = d;
                }
            }
        }
    }
    return H;
}