※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts