반응형
https://www.acmicpc.net/problem/1916
문제 간단 정리
여러 도시가 있고 그 도시를 다닐수 있는 여러 버스가 있다.
시작 도시에서 도착 도시까지 비용을 최소로 하는 비용을 구하여라.
문제 해결 방법
다익스트라 알고리즘을 사용하면 풀 수 있는 문제이다.
다익스트라를 모른다면 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
46
47
48
49
50
51
52
53
54
|
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
int vis[1003]; // 각 도시까지 비용
vector<pair<int, int>> v[1003]; // <도착도시, 비용>
void fc(int a){
priority_queue<pair<int, int>, vector<pair<int,int>>, greater<pair<int, int>>> pq;
// 우선순위 큐 오름차순 정렬
// <비용, 도착 도시>
pq.push(make_pair(0, a));
vis[a] = 0; // 출발 도시 비용 = 0
while (!pq.empty())
{
int cost = pq.top().first; // 현재 도시까지 비용
int x = pq.top().second; // 현재 도시
pq.pop();
// 현 도시까지 비용이 이미 기록된 비용보다 크면 pass
if (vis[x] < cost)
continue;
// x 도시와 이어진 도시들 검사
for (int i = 0; i < v[x].size(); i++){
int nx = v[x][i].first; // 다음 도시
int ncost = cost+v[x][i].second; // 다음 도시까지 비용
// 기록되어진 비용보다 지금 비용이 더 작다면
// 큐에 넣어줌
if (vis[nx] > ncost){
pq.push(make_pair(ncost, nx));
vis[nx] = ncost; // 비용 다시 기록
}
}
}
}
int main(){
int n, m;
cin >> n >> m;
v[0].push_back(make_pair(0, 0));
memset(vis, 98765432, sizeof(vis)); // 모든 비용 최대로
for (int i = 0; i < m; i++){
int a, b, c;
cin >> a >> b >> c;
v[a].push_back(make_pair(b, c));
}
int st, dt; // 출발 도시, 도착 도시
cin >> st >> dt;
fc(st);
cout << vis[dt]; // dt 도시의 비용 출력
return 0;
}
|
cs |
반응형
'알고리즘 > 백준' 카테고리의 다른 글
백준 1504 특정한 최단 경로 c++ [컴공과고씨] (0) | 2023.01.21 |
---|---|
백준 2630 색종이 만들기 c++ [컴공과고씨] (0) | 2023.01.14 |
백준 15686 치킨 배달 c++ [컴공과고씨] (0) | 2023.01.05 |
백준 2096 내려가기 c++ [컴공과고씨] (0) | 2023.01.03 |
백준 13549 숨박꼭질3 c++ [컴공과고씨] (0) | 2023.01.03 |