n(1 ≤ n ≤ 100)개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 m(1 ≤ m ≤ 100,000)개의 버스가 있다. 각 버스는 한 번 사용할 때 필요한 비용이 있다. 모든 도시의 쌍 (A, B)에 대해서 도시 A에서 B로 가는데 필요한 비용의 최솟값을 구하는 프로그램을 작성하시오.
n = 100
일 때도 충분히 1초내로 답을 구할 수 있다.for (int 기준점 = 1; 기준점 <= n; ++기준점)
for (int 시작점 = 1; 시작점 <= n; ++시작점)
for (int 도착점 = 1; 도착점 <= n; ++도착점)
d[시작점][도착점] = min(d[시작점][도착점], d[시작점][기준점] + d[기준점][종료점]);
// https://www.acmicpc.net/problem/11404
#include <iostream>
using namespace std;
static constexpr int MAX = 1e9 + 100; // 대충 큰 수
static int N, M, graph[501][501];
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> N >> M; // N: 노드개수, M: 간선개수
for (int i = 0; i < 501; ++i) {
fill(graph[i], graph[i] + 501, MAX);
graph[i][i] = 0;
}
for (int i = 1; i <= M; ++i) {
int s, f, w; cin >> s >> f >> w;
if (graph[s][f] != MAX && graph[s][f] < w) continue;
graph[s][f] = w;
}
for (int k = 1; k <= N; ++k) // k번째 노드에 대해 테이블 갱신
for (int s = 1; s <= N; ++s) // 모든 출발 정점에 대해 반복
for (int f = 1; f <= N; ++f) // 모든 도착 정점에 대해 반복
graph[s][f] = min(graph[s][f], graph[s][k] + graph[k][f]);
// 수행 결과를 출력함
for (int s = 1; s <= N; ++s) {
for (int f = 1; f <= N; ++f) {
if (graph[s][f] == MAX) cout << 0 << ' ';
else cout << graph[s][f] << ' ';
}
cout <<'\n';
}
}