[BOJ] 파티
Date:
[BOJ] 파티
Problem URL : 파티
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#define p pair<int,int>
#define INF 987654321
using namespace std;
int n, m, x;
int dist[1001][2];
void dijkstra(vector<p> v[], int dir) {
priority_queue<p, vector<p>, greater<p> > pq;
pq.push({ 0, x });
dist[x][dir] = 0;
while (!pq.empty()) {
int hereCost = pq.top().first;
int here = pq.top().second;
pq.pop();
if (dist[here][dir] < hereCost) continue;
for (const auto edge : v[here]) {
int nextCost = hereCost + edge.first;
int next = edge.second;
if (dist[next][dir] > nextCost) {
dist[next][dir] = nextCost;
pq.push({ nextCost, next });
}
}
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n >> m >> x;
vector<p> a[1001], b[1001];
while (m--) {
int u, v, w;
cin >> u >> v >> w;
a[u].push_back({ w, v });
b[v].push_back({ w, u });
}
fill(&dist[1][0], &dist[n][2], INF);
dijkstra(a, 0);
dijkstra(b, 1);
int ans = 0;
for (int i = 1; i <= n; i++) {
int tmp = dist[i][0] + dist[i][1];
if (ans < tmp) ans = tmp;
}
cout << ans << '\n';
return 0;
}
Comments
각각의 노드에서 x까지 왕복하는 최솟값을 구하는 문제이다.
x에서 출발해서 각각의 노드까지 가는 것은 x를 출발점으로 하는 일반적인 다익스트라 문제이다.
문제는 각 노드에서 x까지 가는 것인데, 그래프 간선들의 방향을 반대방향으로 뒤집어주면 된다.
그러면 반대로 뒤집어서 만들어진 인접 리스트로 x에서 각 노드까지 다익스트라를 적용하는 것으로 생각할 수 있다.
댓글