※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1719번 문제인 택배이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1719
1719번: 택배
명우기업은 2008년부터 택배 사업을 새로이 시작하기로 하였다. 우선 택배 화물을 모아서 처리하는 집하장을 몇 개 마련했지만, 택배 화물이 각 집하장들 사이를 오갈 때 어떤 경로를 거쳐야 하
www.acmicpc.net
모든 쌍의 노드에 대해서 두 노드 사이를 최단거리로 이동하기 위해 다음으로 이동해야하는 노드를 구하는 문제이다.
모든 쌍의 노드에 대해 최단거리를 구하는 알고리즘으로는 Floyd-Warshall 알고리즘이 잘 알려져있다.
이 알고리즘을 진행하면서, 최단거리를 갱신할 때 각 노드에서 두 노드 사이의 중간노드로 가는 최단경로방향의 노드가 무엇인지를 기록하는 것으로 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int N, M;
int dist[201][201];
int ans[201][201];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M;
for (int i = 1; i <= N; i++) {
for (int j = i + 1; j <= N; j++) {
dist[i][j] = dist[j][i] = 1000000007;
}
}
while (M--) {
int x, y, d; cin >> x >> y >> d;
if (d < dist[x][y]) {
dist[x][y] = dist[y][x] = d;
ans[x][y] = y, ans[y][x] = x;
}
}
for (int k = 1; k <= N; k++) {
for (int i = 1; i <= N; i++) {
for (int j = i + 1; j <= N; j++) {
if (dist[i][k] + dist[k][j] < dist[i][j]) {
dist[i][j] = dist[j][i] = dist[i][k] + dist[k][j];
ans[i][j] = ans[i][k], ans[j][i] = ans[j][k];
}
}
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (i == j) cout << '-' << ' ';
else cout << ans[i][j] << ' ';
}
cout << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 1746 // C++] 단체 릴레이 (0) | 2022.05.22 |
---|---|
[BOJ 23258 // C++] 밤편지 (0) | 2022.05.21 |
[BOJ 12022 // C++] 짝 (0) | 2022.05.19 |
[BOJ 2174 // C++] 로봇 시뮬레이션 (0) | 2022.05.18 |
[BOJ 14014 // C++] Dudu of English (0) | 2022.05.17 |