알고리즘/백준

백준 1753 최단경로 c++ [컴공과고씨]

시간빌게이츠 2023. 1. 23. 21:49
반응형

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

 

문제 간단 정리

정점이 주어질 때 시작점이 주어지고 그 시작점으로 부터 각 정점의 최단거리를 출력하는 문제.

 

문제 해결 방법

다익스트라 알고리즘을 사용하여 쉽게 풀 수 있는 문제이다.

다익스트라를 모른다면 https://hagisilecoding.tistory.com/134 여기서 보고 오시면 쉽게 풀 수 있습니다.

 

전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <queue>
#include <cstring>
#include <vector>
using namespace std;
int INF = 98765432
int dp[20003];
vector<pair<intint>> v[20003];
void fc(int st){ // 다익스트라 
    memset(dp, INF, sizeof(dp)); // 초기값 
    priority_queue<pair<intint>vector<pair<intint>>, greater<pair<intint>>> pq; // 우선순위 큐
    pq.push({0, st});
    dp[st] = 0// 시작정점 거리 0
    while(!pq.empty()){
        int x = pq.top().second; // 현재 정점
        int cost = pq.top().first; // 현재 정점까지 거리
        pq.pop();
        for (int i = 0; i < v[x].size();i++){
            int nx = v[x][i].first; // 다음 정점
            int ncost = cost + v[x][i].second; // 다음정점까지 거리
 
            if(dp[nx] > ncost){ // 다음 정점에 기록된 거리와 비교
                pq.push({ncost, nx}); 
                dp[nx] = ncost;
            }
        }
    }
}
int main(){
    int V, E, K;
    cin >> V >> E >> K;
    int a1, a2, a3;
    for (int i = 0; i < E;i++){
        cin >> a1 >> a2 >> a3;
        v[a1].push_back({a2, a3});
    }
    fc(K);
    for (int i = 1; i <= V;i++){
        if(dp[i] < INF)
            cout << dp[i] << '\n';
        else
            cout << "INF" << '\n';
    }
    return 0;
}
cs
반응형