/*
全頂点対最短距離を求める
※必ずwarshall_floyd_init(V, dist);を記述した後入力を受け取らないとバグります...
dist[i][i]<0なら負閉路あり
dist[i][j]==1e18ならi->jの経路を持たない
計算量O(V^3)
*/
void warshall_floyd_init(long long V, vector<vector<long long>> &dist)
{
    //初期化
    for (long long i = 0; i < V; i++)
    {
        for (long long j = 0; j < V; j++)
        {
            if (i == j)
                dist[i].push_back(0);
            else
                dist[i].push_back(1e18);
        }
    }
}
void warshall_floyd(long long V, vector<vector<long long>> &dist)
{
    for (long long k = 0; k < V; k++)
    {
        for (long long i = 0; i < V; i++)
        {
            for (long long j = 0; j < V; j++)
            {
                if (dist[i][k] != 1e18 && dist[k][j] != 1e18)
                    dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
            }
        }
    }
}
//以下Main関数内における例
int main()
{
    long long V, E; //V:頂点数,E:辺数
    cin >> V >> E;
    vector<vector<long long>> dist(V);
    //以下必須!
    warshall_floyd_init(V, dist);
    //入力受け取り
    for (long long i = 0; i < E; i++)
    {
        long long s, t, d; //例)頂点sから頂点tへのコストdの有向辺を張る
        cin >> s >> t >> d;
        dist[s][t] = d; //配列外参照,無向,有向に注意
    }
    warshall_floyd(V, dist);
    return 0;
}
    
    
© 2020 kacho65535