edo1z blog

プログラミングなどに関するブログです

C++ ワーシャルフロイド法

参考:素人によるワーシャルフロイド法 - Qiita

グラフ

f:id:edo1z:20200308070421p:plain

コード

#define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
using Graph = vector<vector<int>>;
const int INF = 1e9;

void warshall_floyd(Graph &G) {
  int n = G.size();
  for (int k = 0; k < n; ++k) {
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < n; ++j) {
        G[i][j] = min(G[i][j], G[i][k] + G[k][j]);
      }
    }
  }
}

int main() {
  Graph G = {
      {0, 10, INF, 20, INF, INF, INF, 30},   // A (0)
      {10, 0, 10, INF, INF, INF, INF, INF},  // B (1)
      {INF, 10, 0, INF, 20, INF, INF, INF},  // C (2)
      {20, INF, INF, 0, INF, 20, INF, INF},  // D (3)
      {INF, INF, 20, INF, 0, INF, INF, 20},  // E (4)
      {INF, INF, INF, 20, INF, 0, 10, INF},  // F (5)
      {INF, INF, INF, INF, INF, 10, 0, 10},  // G (6)
      {30, INF, INF, INF, 20, INF, 10, 0}    // H (7)
  };
  warshall_floyd(G);
  for (vector<int> costs : G) {
    for (int cost : costs) {
      printf("%2d ", cost);
    }
    cout << endl;
  }
}

結果

 0 10 20 20 40 40 40 30 
10  0 10 30 30 50 50 40
20 10  0 40 20 60 50 40
20 30 40  0 60 20 30 40
40 30 20 60  0 40 30 20
40 50 60 20 40  0 10 20
40 50 50 30 30 10  0 10
30 40 40 40 20 20 10  0