짱아의 개발 기록장

백준 11779번. 최소 비용구하기 2(c++) / 다익스트라 본문

Algorithm/Baekjoon

백준 11779번. 최소 비용구하기 2(c++) / 다익스트라

jungahshin 2020. 8. 7. 11:24
반응형

전형적인 다익스트라 문제이다.

다만, 최소 비용을 구하는 것에서 끝나는 것이 아니라 최소비용을 위해 거치는 모든 도시들을 출력해야한다.

 

그래서 본인은 city라는 배열을 사용하여 최소 비용의 값이 갱신 될 때마다, 해당 도시를 넣어주었다.

즉, city[a] = b라면 a로 오는 모든 경로중 최소 비용을 차지하는 경로의 출발 도시가 b임을 의미한다.(b->a)

 

 

코드 첨부

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// 최소 비용구하기 2(다익스트라)
#include <iostream>
#include <queue>
#include <algorithm>
#include <climits>
 
using namespace std;
 
int n, m, from, to, cost, Start, End;
priority_queue<pair<intint>vector<pair<intint>>, greater<pair<intint>> > pq;
vector<pair<intint> > v[1001];
int city[1001= {0, }; // city[a] = b이면, a도시는 b에서 오는게 가장 최소 비용이다.
int dist[1001= {0, };
int visited[1001= {0, };
vector<int> final;
 
void go()
{
    dist[Start] = 0;
    pq.push(make_pair(0, Start));
 
    while(!pq.empty()){
        int x = pq.top().second;
        int num = pq.top().first;
        pq.pop();
 
        if(!visited[x]){
            visited[x] = 1;
            for(int i=0; i<v[x].size(); i++){
                if(dist[v[x][i].first]>num+v[x][i].second){
                    city[v[x][i].first] = x;
                    dist[v[x][i].first] = num+v[x][i].second;
                    pq.push(make_pair(dist[v[x][i].first], v[x][i].first));
                }
            }
        }
    }
}
 
void print_go(int C)
{
    if(C==Start){
        return;
    }
    final.push_back(city[C]);
 
    print_go(city[C]);
}
 
int main()
{
    cin>>n>>m;
    for(int i=0; i<m; i++){
        cin>>from>>to>>cost;
        v[from].push_back(make_pair(to, cost));
    }
    cin>>Start>>End;
 
    for(int i=1; i<=n; i++){
        dist[i] = INT_MAX;
    }
 
    go();
    cout<<dist[End]<<"\n";
 
    final.push_back(End);
    print_go(End);
    cout<<final.size()<<"\n";
    for(int i=final.size()-1; i>=0; i--){
        cout<<final[i]<<" ";
    }
    cout<<"\n";
    return 0;
}
cs

 

문제 첨부

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

 

11779번: 최소비용 구하기 2

첫째 줄에 도시의 개수 n(1≤n≤1,000)이 주어지고 둘째 줄에는 버스의 개수 m(1≤m≤100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스�

www.acmicpc.net

반응형
Comments