Problem Solving/BOJ(백준)
[BOJ]백준 1719번: 택배(C++)/FloydWarshall
이진2
2021. 5. 17. 01:25
https://www.acmicpc.net/problem/1719
1719번: 택배
명우기업은 2008년부터 택배 사업을 새로이 시작하기로 하였다. 우선 택배 화물을 모아서 처리하는 집하장을 몇 개 마련했지만, 택배 화물이 각 집하장들 사이를 오갈 때 어떤 경로를 거쳐야 하
www.acmicpc.net

이모티콘이 생겼다
택배 문제는 모든 정점에서 모든 정점으로의 최단 거리 및 최초 경유지를 구하는 문제이다
다익스트라와 플로이드와샬 두가지 방법 아무거나 사용해서 해결할 수 있다
map[i][j] = k
-> i번 집하장에서 j번 집하장으로 최단 경로를 통해 가기 위해서는 제일 먼저 k번 집하장으로 이동해야 한다
라고 할 때, distance가 갱신되는 시점에 해당 값을 update해주면 된다
#include <cstdio>
#include <vector>
#define INF 987654321
using namespace std;
int n, m;
int main() {
scanf("%d%d", &n, &m);
vector<vector<int>> dist(n + 1, vector<int>(n + 1, INF));
vector<vector<int>> map(n + 1, vector<int>(n + 1, 0));
for (int i = 0, u, v, w; i < m; i++) {
scanf("%d%d%d", &u, &v, &w);
dist[u][v] = w;
dist[v][u] = w;
map[u][v] = v;
map[v][u] = u;
}
for (int i = 1; i <= n; i++) {
dist[i][i] = 0;
map[i][i] = i;
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (dist[i][j] > dist[i][k] + dist[k][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
map[i][j] = map[i][k];
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j)printf("- ");
else printf("%d ", map[i][j]);
}
printf("\n");
}
return 0;
}