본문 바로가기

백준/골드

[백준 1753번] 최단경로 (C++)

문제링크 : 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 <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>

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

int arr[200001];  //정점
vector<pii>edge[300001]; //간선+가중치

void dijkstra()
{
    arr[start]=0;  //첫 시작점 초기화
    priority_queue<pii, vector<pii>, greater<pii>>pq; //비용이 작은 것부터
    pq.push({0, start}); //비용, 시작점
    while(!pq.empty())
    {
        auto [cost, cur] = pq.top();
        pq.pop();

        if(arr[cur] < cost) continue;

        for(int i=0; i<edge[cur].size(); i++)
        {
            int next = edge[cur][i].first; //다음 정점
            int ncost = cost + edge[cur][i].second;  //다음 비용

            if(arr[next] > ncost) 
            {
                arr[next] = ncost;
                pq.push({ncost, next});
            }
        }
    }
}

int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin >> V >> E;  //정점, 간선
    cin >> start;   //시작점

    for(int i=1; i<=V; i++)
    {
        arr[i]=MAX;  //최댓값으로 초기화
    }

    for(int i=0; i<E; i++)
    {
        cin >> u >> v >> w;
        edge[u].push_back({v, w});  //방향그래프
    }

    dijkstra();

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

    return 0;
}

다익스트라 알고리즘 그자체인 문제이다.

저번에 달빛 여우라는 골드 1 짜리 다익스트라 문제를 풀면서 다익스트라에 대해 아직 잘 이해를 못한 것 같아서 조금 쉬운 걸로 풀게 되었다.

 

priority_queue<pii, vector<pii>, greater<pii>>pq

이 부분은 pq의 first가 작은 것부터 우선순위를 갖게 만드는 구문이다.

여기서 first를 비용으로 줬기 때문에 비용이 적게 드는 것부터 우선순위를 갖게 된다.

보통 비용을 우선순위로 만들기 때문에 저 구문을 사용하지 않는다면 비용에 -을 붙여서 음수로 처리한다.

'백준 > 골드' 카테고리의 다른 글

[백준 9019번] DSLR (C++)  (0) 2023.04.14
[백준 16236번] 아기 상어 (C++)  (0) 2023.04.14
[백준 11404번] 플로이드 (C++)  (0) 2023.04.09
[백준 16118번] 달빛 여우 (C++)  (0) 2023.04.03
[백준 15942번] 전단지 돌리기 (C++)  (0) 2023.04.01