💡 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"); } }