플로이드를 이용하는 문제
플로이드의 핵심은 경유
와 모든 노드에서의 최소 비용(거리)
arr[i][j] = min(arr[i][j], arr[i][k]+arr[k][j])
i
는 출발 도시, j
는 도착 도시, k
는 경유 도시인데, 출발에서 도착까지의 거리와 경유하는 경우를 비교해서 갱신한다.arr[i][j]
가 INF
보다 크거나 같다면 0
을 넣고 출력한다.#include <iostream>
#include <vector>
#define INF 100000000
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
vector<vector<int>> arr(n+1,vector<int>(n+1,INF));
for (int i = 0;i < m;i++) {
int st, ar, co;
cin >> st >> ar >> co;
arr[st][ar] = min(arr[st][ar], co);
}
for (int i = 1;i <= n;i++) {
arr[i][i] = 0;
}
for (int k = 1;k <= n;k++) { //경유
for (int i = 1;i <= n;i++) { //출발
for (int j = 1;j <= n;j++) { //도착
arr[i][j] = min(arr[i][j], arr[i][k] + arr[k][j]);
}
}
}
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= n;j++) {
if (arr[i][j] >= INF) arr[i][j] = 0;
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}