halang-log
💡 PS

[BOJ] 1719 택배

date
Mar 23, 2022
slug
boj-1719
author
status
Public
tags
PS
dijkstra
summary
택배 문제에 대한 풀이입니다.
type
Post
thumbnail
category
💡 PS
updatedAt
Aug 3, 2023 09:17 AM
언어

문제

풀이

나는 다익스트라 알고리즘을 이용하여 문제를 풀었다.
집하장에서 다른 집하장으로 최단경로로 화물을 이동시키기 위해 가장 먼저 거쳐야 하는 집하장을 나타내야 한다.
이를 조금 다르게 생각해보았다.
집하장a에서 집하장b로 가기 위해 가장 마지막에 거치는 집하장을 c라 하면, c집하장b에서 집하장a로 가기 위해 처음으로 거치는 집하장이 되는 것이다.
이를 이용하여 0부터 N-1까지 for문을 돌려 다익스트라의 시작점을 설정해주고 go()에서 ans배열에 정답을 저장해주었다.
ans[i][j] = i에서 j까지 최단 경로로 이동할 때 가장 처음으로 이동해야 하는 집하장

코드

#include <cstdio> #include <algorithm> #include <queue> using namespace std; typedef pair<int, int> pii; int n, m; vector<pii> v[200]; pii dis[200]; int ans[200][200]; void go(int s) { for(int i = 0; i < n; i++) { dis[i].first = 1e9; dis[i].second = -1; } priority_queue<pii, vector<pii>, greater<pii>> pq; pq.push({0, s}); dis[s].first = 0; while (!pq.empty()) { int d = pq.top().first, now = pq.top().second; pq.pop(); if (d > dis[now].first) continue; for(pii i : v[now]) { if (dis[i.first].first <= i.second + dis[now].first) continue; dis[i.first].first = i.second + dis[now].first; dis[i.first].second = now; pq.push({dis[i.first].first, i.first}); } } for(int i = s; i < n; i++) ans[i][s] = dis[i].second; for(int i = s; i >= 0; i--) ans[i][s] = dis[i].second; } int main() { scanf("%d %d", &n, &m); int a, b, c; for(int i = 0; i < m; i++) { scanf("%d %d %d", &a, &b, &c); a--; b--; v[a].push_back({b, c}); v[b].push_back({a, c}); } for(int i = 0; i < n; i++) go(i); for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if (i == j) printf("- "); else printf("%d ", ans[i][j]+1); } printf("\n"); } }