https://www.acmicpc.net/problem/1238
이번 문제는 왕복 경로에 대한 다익스트라 수행에 대한 내용이다. 보통 다익스트라 라고 함은, 방향성 그래프에서 시작점과 도착점에 대한 경로의 최소비용을 구하는 알고리즘이다. 하지만 이 문제는 특정 경유지를 제시해주고, 시작점에서 출발하여 경유지를 경유한 다음 다시 원점으로 돌아오는 왕복 경로에 대한 탐색을 요구한다. 문제에서 요구하는 조건이 얼핏보면 복잡해 보이지만 그냥 시작점~경유지 / 경유지~시작점 까지의 경로를 다익스트라를 통해 탐색해주고, 서로 더해주는 매커니즘만 추가하면 해결할 수 있다.
해당 매커니즘을 구현하기 위해서는 각각의 경로의 비용을 저장할 cost 배열을 하나 더 만들어 주어야 한다. 그 다음, 수행하는 다익스트라 알고리즘에 대하여 올바른 cost값을 참조할 수 있도록 함수 인자에 배열 포인터를 부여하여 함수를 선언해주었다.
골드3 정도 난이도의 문제라고 되어있는데, 개인적으로 골드4~5 정도로 하향하는게 좋아보인다. 문제를 보고 대략 15분만에 바로 풀었는데, 문제 취지만 이해한다면 의외로 간단하게 해결할 수 있었던 문제인거 같다.
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define MAX 1001
#define INF 999999999
using namespace std;
vector<pair<int,int>> Graph[MAX];
int costX[MAX];
int cost[MAX];
void dijkstra(int start, int cost[]) {
cost[start] = 0;
priority_queue<pair<int,int>> pq;
pq.push(make_pair(start,0));
while (!pq.empty()) {
int current = pq.top().first;
int dist = -pq.top().second;
pq.pop();
if (cost[current] < dist) continue;
for (int i=0; i<Graph[current].size(); i++) {
int newCurr = Graph[current][i].first;
int newDist = dist + Graph[current][i].second;
if (newDist < cost[newCurr]) {
cost[newCurr] = newDist;
pq.push(make_pair(newCurr, -newDist));
}
}
}
}
int main() {
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int V, E, X;
cin >> V >> E >> X;
for (int i=0; i<E; i++) {
int a,b,c;
cin >> a >> b >> c;
Graph[a].push_back(make_pair(b,c));
}
for (int i=1; i<=V; i++) costX[i] = INF;
dijkstra(X, costX);
for (int i=1; i<=V; i++) {
for (int i=1; i<=V; i++) cost[i] = INF;
int target = i;
dijkstra(target, cost);
costX[target] += cost[X];
}
int max = costX[1];
for (int i=2; i<=V; i++) {
if (costX[i] > max) max = costX[i];
else continue;
}
cout << max << '\n';
return 0;
}
728x90
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] #4963 섬의 개수 (0) | 2024.02.15 |
---|---|
[BOJ] #11286 절댓값 힙 (0) | 2024.02.14 |
[BOJ] #1916 최소비용 구하기 (0) | 2024.02.08 |
[BOJ] #2583 영역 구하기 (0) | 2024.02.04 |
[BOJ] #2468 안전 영역 (0) | 2024.02.04 |