Coding Test/BaekJoon_C++

백준 1753 <최단경로> C++

JunOnJuly 2024. 2. 29. 18:20
728x90

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

 

1753번: 최단경로

첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가

www.acmicpc.net


다익스트라 알고리즘을 사용해 풀 수 있습니다.


#include <iostream>
#include <array>
#include <vector>
#include <deque>
#include <algorithm>

using namespace std;

/*
다익스트라 함수를 사용
*/
array<int, 20001> dijkstra(array<vector<array<int, 2>>, 20001> tree, int K, int V)
{
    // 시스템상 최대 수 한계
    const int max_num = 3000001;
    // K 부터 특정 노드까지의 거리 어레이
    array<int, 20001> dist_arr;
    // 최대 수로 채우기
    dist_arr.fill(max_num);
    // 시작 노드까지 거리는 0
    dist_arr[K] = 0;
   
    // 힙에 넣기
    deque<array<int, 2>> dq{ {0, K} };
    make_heap(dq.begin(), dq.end());

    // 힙이 빌때까지 순회
    while (!dq.empty())
    {
        // 팝
        int now_dist = -dq.front()[0];
        int now_node = dq.front()[1];

        dq.pop_front();

        // 현재 거리와 기록된 거리 비교
        if (now_dist > dist_arr[now_node]) continue;

        // 자식 노드 순회하며 비교
        for (auto data : tree[now_node])
        {
            int next_node = data[0];
            int next_dist = data[1];
           
            // 다음 노드까지의 거리가 기록된 거리보다 크면 스킵
            if (now_dist + next_dist < dist_arr[next_node])
            {
                dq.push_back({ -(now_dist + next_dist), next_node });
                push_heap(dq.begin(), dq.end());
                dist_arr[next_node] = now_dist + next_dist;
            }
        }
    }

    return dist_arr;
}

int main(void)
{
    int V, E, K;
    cin >> V >> E >> K;
    // 트리 / tree[i] = { {자식 노드, 자식 노드까지의 거리} ... }
    array<vector<array<int, 2>>, 20001> tree;

    for (int i = 0; i < E; i++)
    {
        int u, v, w;
        cin >> u >> v >> w;

        tree[u].push_back({ v, w });
    }

    array<int, 20001> dist_arr = dijkstra(tree, K, V);
    for (int i = 0; i < V; i++)
    {
        if (dist_arr[i + 1] == 3000001) cout << "INF" << "\n";
        else cout << dist_arr[i + 1] << "\n";
    }
}

 

728x90