[백준/BOJ] 백준 1719번 : 택배

2023. 10. 20. 01:33알고리즘 문제풀이

https://www.acmicpc.net/problem/1719

 

1719번: 택배

명우기업은 2008년부터 택배 사업을 새로이 시작하기로 하였다. 우선 택배 화물을 모아서 처리하는 집하장을 몇 개 마련했지만, 택배 화물이 각 집하장들 사이를 오갈 때 어떤 경로를 거쳐야 하

www.acmicpc.net

 

각 지점을 출발점으로 한 번씩 다익스트라를 수행하는데, 이때 다익스트라를 수행하는 우선순위 큐에, 처음에 어디로 이동했는지에 대한 정보도 함께 넣어서 출발지에서 어떠한 지점으로 최단거리에 왔을 때 처음에 어디로 이동했는지도 알 수 있도록 했다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;

int n, m;
vector<vector<int>> short_dist(205, vector<int>(205, 987654321));
vector<pair<int, int>> adj[205];
int result[205][205];

void solve(int start) {

	short_dist[start][start] = 0;

	priority_queue<tuple<int, int, int>> pq; //(-비용, 위치, 처음에 어디로 이동했는지)
	pq.push(make_tuple(-0, start, -1));

	while (!pq.empty()) {
		int here_cost = -get<0>(pq.top());
		int here = get<1>(pq.top());
		int first_step = get<2>(pq.top());
		pq.pop();

		if (here_cost > short_dist[start][here]) {
			continue;
		}

		result[start][here] = first_step;

		for (int i = 0; i < adj[here].size(); i++) {
			int there = adj[here][i].second;
			int there_cost = here_cost + adj[here][i].first;
			int there_first_step = first_step;

			if (there_cost < short_dist[start][there]) {
				short_dist[start][there] = there_cost;

				//there가 처음 이동하는 위치일때
				if (first_step == -1) {
					there_first_step = there;
				}

				pq.push(make_tuple(-there_cost, there, there_first_step));
			}
		}
	}


}

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	cin >> n >> m;

	for (int i = 0; i < m; i++) {
		int u, v, cost;
		cin >> u >> v >> cost;

		adj[u].push_back(make_pair(cost, v));
		adj[v].push_back(make_pair(cost, u));
	}

	for (int i = 1; i <= n; i++) {
		solve(i);
	}

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (result[i][j] == -1) {
				cout << "-";
			}
			else {
				cout << result[i][j];
			}
			cout << " ";
		}
		cout << "\n";
	}

	return 0;
}