📕알고리즘 문제/📝Baekjoon

[백준] 골드3 : (1238) 파티

주으기 2024. 4. 12. 13:58
728x90
반응형

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

 

#include <iostream>
#include <vector>
#include <queue>
#include <map>
using namespace std;

int N, M, X, Cnt;
map<int, vector<pair<int, int>>> m;
vector<int> D1, D2;

int Dijkstra(int start, int dest)
{
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    vector<bool> visit(N + 1, false);
    vector<int> dist(N + 1, 987654321);

    pq.push({ 0, start });
    dist[start] = 0;

    while (!pq.empty())
    {
        int c = pq.top().first;
        int n = pq.top().second;
        pq.pop();

        if (visit[n]) continue;
        visit[n] = true;

        for (const auto& i : m[n])
        {
            if (dist[i.first] > c + i.second)
            {
                dist[i.first] = c + i.second;
                pq.push({ dist[i.first], i.first });
            }
        }
    }
    return dist[dest];
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> N >> M >> X;

    D1.resize(N + 1, 987654321);
    D2.resize(N + 1, 987654321);
    for (int i = 0, a, b, c; i < M; ++i)
    {
        cin >> a >> b >> c;
        m[a].push_back({ b, c });
    }

    for (int i = 1; i <= N; ++i)
    {
        if (i == X) continue;
        D1[i] = Dijkstra(i, X);
    }

    for (int i = 1; i <= N; ++i)
    {
        if (i == X) continue;
        D2[i] = Dijkstra(X, i);
    }

    int answer = 0;
    for (int i = 1; i <= N; ++i)
    {
        if (i == X) continue;
        answer = max(answer, D1[i] + D2[i]);
    }

    cout << answer << "\n";
}

각 마을과 도착 마을 간의 다익스트라로 경로를 구하고, 반대로 도착 마을부터 각 마을까지의 다익스트라를 구한다.

 

이 둘의 합이 가장 높은 값을 출력한다.

 

 

 

 

 

728x90
반응형