백준의 최소비용 구하기2(11779) 문제이다.
[ 문제 바로가기 ]
[ 문제풀이 ]
양의 가중치만 존재하는 그래프에서 A도시에서 B도시 까지 가는데 걸리는 최소비용을 구해야 하는 문제이다.
동시에, 그 경로 또한 출력해야 하는 문제이다.
먼저, 최소비용을 구해야 하는 문제이고, 양의 가중치만 존재하는 문제이기 때문에 본인은 다익스트라 알고리즘으로
접근하였다. 아직 다익스트라 알고리즘에 대해서 잘 모른다면 아래의 글을 참고하도록 하자.
다익스트라 알고리즘을 그대로 적용시키기만 하면 되는데, 그 경로 또한 출력해야 하기 때문에 본인은 경로를 저장할
int형 1차원 배열을 하나 선언해 주었다.
이 배열의 이름을' Route[]' 라고 가정해보자.
Route[a] = b 의 의미는 "a번 정점에 최소 비용으로 도달하기 위해서는 b정점에서 와야 합니다" 를 의미한다.
더욱 구체적으로 이야기를 해보자면, 'a'라는 정점에서 'c'라는 정점까지 최소비용으로 가야 하는데, 이 때 최소 비용이
드는 루트가 a - b - c 로 가는 루트라고 가정해보자.
그렇게 되면, a에서 b를 선택하는 과정에서 Route[b] = a, b에서 c를 선택하는 과정에서 Route[c] = b 가 된다.
최종적으로는, 이 Route배열을 다음과 같이 역추적을 해주면 된다.
'c'를 오기 위해서 Route[c]를 확인하니 'b'가 존재
'b'를 오기 위해서 Route[b]를 확인하니 'a'가 존재
'a'를 오기 위해서 Route[a]를 확인하니 '0'이 존재.(a가 시작점이였으므로 Route[a]의 값은 0이다)
[ 소스코드 ]
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 75 76 77 78 79 80 81 82 83 | #include<iostream> #include<vector> #include<queue> #define endl "\n" #define MAX 1010 #define INF 987654321 using namespace std; int N, M, Start, End; int Dist[MAX]; int Route[MAX]; vector<pair<int, int>> V[MAX]; vector<int> Route_V; void Input() { cin >> N >> M; for (int i = 1; i <= N; i++) Dist[i] = INF; for (int i = 0; i < M; i++) { int a, b, c; cin >> a >> b >> c; V[a].push_back(make_pair(b, c)); } cin >> Start >> End; } void Solution() { priority_queue<pair<int, int>> PQ; PQ.push(make_pair(0, Start)); Dist[Start] = 0; while (PQ.empty() == 0) { int Cost = -PQ.top().first; int Cur = PQ.top().second; PQ.pop(); for (int i = 0; i < V[Cur].size(); i++) { int Next = V[Cur][i].first; int nCost = V[Cur][i].second; if (Dist[Next] > Cost + nCost) { Route[Next] = Cur; Dist[Next] = Cost + nCost; PQ.push(make_pair(-Dist[Next], Next)); } } } cout << Dist[End] << endl; int Temp = End; while (Temp) { Route_V.push_back(Temp); Temp = Route[Temp]; } cout << Route_V.size() << endl; for (int i = Route_V.size() - 1; i >= 0; i--) cout << Route_V[i] << " "; cout << endl; } void Solve() { Input(); Solution(); } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글
[ 백준 5052 ] 전화번호 목록 (C++) (4) | 2020.03.23 |
---|---|
[ 백준 11286 ] 절대값 힙 (C++) (0) | 2020.03.21 |
[ 백준 9370 ] 미확인 도착지 (C++) (0) | 2020.03.17 |
[ 백준 6118 ] 숨바꼭질 (C++) (0) | 2020.03.13 |
[ 백준 4485 ] 녹색 옷 입은 애가 젤다지 ? (C++) (0) | 2020.03.13 |