문제 : https://www.acmicpc.net/problem/9370
최단경로 다익스트라
시작지점 S에서 최단거리로 도착 후보 지점으로 갈 때, 최단 경로에 G-H 교차로가 포함되어있다면 우리가 원하는 정답이다. 어렵게 생각하지말고, S 에서 어떤 목적지 D로 가는 최단 거리가 S에서 G로가는 최단거리 + G에서 H로 가는 최단거리 + H에서 D로가는 최단거리와 같거나 반대로 S에서 H로 가는 최단거리 + H에서 G로 가는 최단 거리 + G 에서 D로가는 최단거리와 같은지 체크하면 된다.
따라서, 다익스트라 알고리즘을 이용해 시작지점 S / G / H 에서 각각 다른 모든 정점과의 최단 거리를 구하면 된다.
#include<iostream>
#include<queue>
#include<algorithm>
#define INF 999999999
using namespace std;
vector<int> dijkstra(vector<pair<int, int>> graph[2001], int n , int s) {
priority_queue<pair<int, int>> pq;
vector<int> distance(n + 1, INF);
distance[s] = 0;
pq.push({ 0, s });
while (!pq.empty()) {
int cost = -pq.top().first;
int here = pq.top().second;
pq.pop();
if (distance[here] < cost) continue;
for (int i = 0; i < graph[here].size(); i++) {
int next = graph[here][i].first;
int nextDist = graph[here][i].second + cost;
if (distance[next] > nextDist) {
distance[next] = nextDist;
pq.push({ -nextDist, next });
}
}
}
return distance;
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T;
cin >> T;
while (T--) {
int n, m, t, s, g, h;
cin >> n >> m >> t >> s >> g >> h;
vector<pair<int, int>> graph[2001];
vector<int> destination(t);
for (int i = 0, a, b, d; i < m; i++) {
cin >> a >> b >> d;
graph[a].push_back({ b, d });
graph[b].push_back({ a, d });
}
for (int i = 0; i < t; i++)
cin >> destination[i];
vector<int> distanceS = dijkstra(graph, n, s);
vector<int> distanceG = dijkstra(graph, n,g);
vector<int> distanceH = dijkstra(graph, n,h);
sort(destination.begin(), destination.end());
for (int i = 0; i < t; i++) {
if (distanceS[destination[i]] != INF && distanceS[g] + distanceG[h] + distanceH[destination[i]] == distanceS[destination[i]])
cout << destination[i] << ' ';
else if (distanceS[destination[i]] != INF && distanceS[h] + distanceH[g] + distanceG[destination[i]] == distanceS[destination[i]])
cout << destination[i] << ' ';
}
cout << '\n';
}
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 9935 : EKSPLOZIJA (0) | 2020.05.07 |
---|---|
[BOJ] 1799 : 비숍 (0) | 2020.05.06 |
[BOJ] 1744 : 수 묶기 - travelbeeee (0) | 2020.04.24 |
[BOJ] 5670 : Cellphone Typing (0) | 2020.04.23 |
[BOJ] 5052 : Phone List (0) | 2020.04.22 |