[백준/BOJ] 백준 1719번 : 택배
2023. 10. 20. 01:33ㆍ알고리즘 문제풀이
https://www.acmicpc.net/problem/1719
각 지점을 출발점으로 한 번씩 다익스트라를 수행하는데, 이때 다익스트라를 수행하는 우선순위 큐에, 처음에 어디로 이동했는지에 대한 정보도 함께 넣어서 출발지에서 어떠한 지점으로 최단거리에 왔을 때 처음에 어디로 이동했는지도 알 수 있도록 했다.
코드
#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;
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준/BOJ] 백준 23032번 : 서프라이즈~ (0) | 2023.10.25 |
---|---|
[백준/BOJ] 백준 4386번 : 별자리 만들기 (0) | 2023.10.20 |
[백준/BOJ] 백준 2342번 : Dance Dance Revolution (0) | 2023.10.20 |
[백준/BOJ] 백준 18877번 : Social Distancing (0) | 2023.10.20 |
[백준/BOJ] 백준 17619번 : 개구리 점프 (0) | 2023.10.20 |