https://www.acmicpc.net/problem/11404
11404번: 플로이드
첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가
www.acmicpc.net
dire[a][b]는 a번 노드에서 b번 노드로 가는 비용을 담아둔다.
i, j, N을 차례로 반복문에 돌려서 j에서 i를 거쳐 N으로 가는 최단경로를 갱신해준다.
#include<iostream>
#include<algorithm>
using namespace std;
int dire[100][100];
//초기에 정점간의 거리들을 초기화 해줄 수
const int INF = 987654321;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n, m, a, b, c;
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
dire[i][j] = INF;
}
}
for (int i = 0; i < n; i++) {
dire[i][i] = 0;
}
for (int i = 0; i < m; i++) {
cin >> a >> b >> c;
a -= 1;
b -= 1;
dire[a][b] = min(dire[a][b], c);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int N = 0; N < n; N++) {
if (j == N) continue;
//j에서 i 혹은 i에서 N으로 가는 경로가 없을 때
if (dire[j][i] == INF || dire[i][N] == INF) continue;
//최단경로 갱신
dire[j][N] = min(dire[j][N], dire[j][i] + dire[i][N]);
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
//갈 수 없을 때
if (dire[i][j] == INF) cout << 0 << ' ';
else cout << dire[i][j] << ' ';
}
cout << '\n';
}
return 0;
}
'백준 문제 풀이' 카테고리의 다른 글
백준 3015번 오아시스 재결합 (0) | 2021.03.16 |
---|---|
백준 16894번 약수 게임 (0) | 2021.03.16 |
백준 1967번 트리의 지름 (0) | 2021.03.16 |
백준 9613번 GCD 합 (0) | 2021.03.16 |
백준 13305번 주유소 (0) | 2021.03.16 |