Algorithm/BOJ

[BOJ] #1238 파티

jHoon0223 2024. 2. 8. 17:03

https://www.acmicpc.net/problem/1238

 

1238번: 파티

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어

www.acmicpc.net


이번 문제는 왕복 경로에 대한 다익스트라 수행에 대한 내용이다. 보통 다익스트라 라고 함은, 방향성 그래프에서 시작점과 도착점에 대한 경로의 최소비용을 구하는 알고리즘이다. 하지만 이 문제는 특정 경유지를 제시해주고, 시작점에서 출발하여 경유지를 경유한 다음 다시 원점으로 돌아오는 왕복 경로에 대한 탐색을 요구한다. 문제에서 요구하는 조건이 얼핏보면 복잡해 보이지만 그냥 시작점~경유지 / 경유지~시작점 까지의 경로를 다익스트라를 통해 탐색해주고, 서로 더해주는 매커니즘만 추가하면 해결할 수 있다.

해당 매커니즘을 구현하기 위해서는 각각의 경로의 비용을 저장할 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