[문제보기]

 1753. 최단경로

 

1753번: 최단경로

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

www.acmicpc.net

 

[풀이과정]

이 문제는 다익스트라 알고리즘을 사용하면 되는 문제이다. 

[소스코드]

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

const int INF = 987654321;
int V, E, K;
int Dist[20001] = {0};
vector<pair<int, int>> vec[20001];

void Dijstra(){
    priority_queue<pair<int, int>> pq;
    // 가중치, 노드 순서 (가중치에 대한 오름차순을 만들기 위해)
    pq.push({0, K});
    Dist[K] = 0;

    while(!pq.empty()){
        int cost = -pq.top().first;
        int cur = pq.top().second;
        pq.pop();

        for(int i=0; i<vec[cur].size(); i++){
            int next = vec[cur][i].first;
            int ncost = vec[cur][i].second;

            if(Dist[next] > cost + ncost){
                Dist[next] = cost + ncost;
                pq.push({-Dist[next], next});
            }
        }
    }
}

int main(){
    cin >> V >> E >> K;
    for(int i=0; i<E; i++){
        int a, b, w;
        cin >> a >> b >> w;
        //노드, 가중치 순서
        vec[a].push_back({b, w});
    }

    for(int i=1; i<=V; i++){
        Dist[i] = INF;
    }

    Dijstra();

    for(int i=1; i<=V; i++){
        if(Dist[i] == INF)
            cout << "INF" << "\n";
        else
            cout << Dist[i] << "\n";
    }
}