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 <vector>
#include <queue>

#define INF int(10e8)

using namespace std;

int V, E, K;
int u, v, w;

int main(void)
{
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    cin >> V >> E >> K;
    
    vector<int> answer(V+1, INF);                           // 각 인덱스는 각 노드까지의 최단거리를 담음
    vector<vector<pair<int,int>>> nodes(V+1);               // 전체 노드들 연결 정보를 담음
    
    for(int i = 0 ; i < E ; i++)                            // 간선들을 연결
    {
        cin >> u >> v >> w;                                 // 연결이 양방향으로 다 되는 것이 아니라, 주어진 방향으로만 연결됨을 주의
        nodes[u].push_back(pair<int,int>(v,w));
    }

    priority_queue<pair<int,int>> pq;                       // 우선순위 큐를 사용하여 다음에 탐색할 최단거리 노드가 앞에 올 수 있게
    pq.push(pair<int,int>(0,K));                            // 시작점은 K 번으로, 거리는 0으로 설정
    answer[K] = 0;

    while(pq.size())
    {
        int pos = pq.top().second;                          // 다음 탐색할 노드 정보
        int dist = -pq.top().first;
        pq.pop();           

        for(int i = 0 ; i < nodes[pos].size() ; i++)        // 해당 노드에서 연결된 다른 노드들 점검
        {
            int nextPos = nodes[pos][i].first;
            int nextDist = nodes[pos][i].second;
            if(dist + nextDist < answer[nextPos])           // 최단거리 갱신되는 노드들에만 대해서
            {
                answer[nextPos] = dist + nextDist;          // 업데이트 해주고
                pq.push(pair<int,int>(-(dist+nextDist), nextPos));  // 큐에 푸시
            }
        }
    }

    for(int i = 1 ; i <= V ; i++)                               // 최단거리들 최종적으로 출력
    {
        if(answer[i] == INF) cout << "INF" << '\n';
        else cout << answer[i] << '\n';
    }
}

'PS > BOJ' 카테고리의 다른 글

[백준] 9251.cpp : LCS  (0) 2020.08.25
[백준] 1916.cpp : 최소비용 구하기  (0) 2020.08.21
[백준] 1043.cpp : 거짓말  (0) 2020.08.17
[백준] 1912.cpp : 연속합  (0) 2020.08.16
[백준] 10844.cpp : 쉬운 계단 수  (0) 2020.08.15

+ Recent posts