[BOJ] 특별한 최단 경로
Date:
[BOJ] 특별한 최단 경로
Problem URL : 특별한 최단 경로
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#define p pair<int,int>
#define MAX_INTEGER 987654321
using namespace std;
vector<p> edge[801];
int N, E;
vector<int> dijk(int start) {
vector<int> dist(N + 1, MAX_INTEGER);
dist[start] = 0;
priority_queue<p> q;
q.push({ start, 0 });
while (!q.empty()) {
int node = q.top().first;
int cost = q.top().second;
q.pop();
if (dist[node] < cost) continue;
for (int i = 0; i < edge[node].size(); i++) {
int nextNode = edge[node][i].first;
int nextCost = edge[node][i].second;
if (dist[nextNode] > dist[node] + nextCost) {
dist[nextNode] = dist[node] + nextCost;
q.push({ nextNode, dist[nextNode] });
}
}
}
return dist;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin >> N >> E;
for (int i = 0; i < E; i++) {
int node1, node2, cost;
cin >> node1 >> node2 >> cost;
edge[node1].push_back({ node2, cost });
edge[node2].push_back({ node1, cost });
}
int node1, node2;
long long ans1 = 0, ans2 = 0;
cin >> node1 >> node2;
vector<int> dist;
dist = dijk(1); // 1부터 각 노드까지 최단거리 리스트
ans1 += dist[node1];
ans2 += dist[node2];
dist = dijk(node1); // node1부터 각 노드까지 최단거리 리스트
ans1 += dist[node2];
ans2 += dist[N];
dist = dijk(node2); // node2부터 각 노드까지 최단거리 리스트
ans1 += dist[N];
ans2 += dist[node1];
long long res = min(ans1, ans2);
if (res >= MAX_INTEGER) {
cout << -1;
} else {
cout << res;
}
return 0;
}
댓글