정점 N개와 M개의 간선이 주어진다. A번째 정점에서 B번째 정점까지 도달하는 데 드는 최소 비용을 출력하라.
첫째 줄에 N(1 <= N <= 1,000), 둘째 줄에 M(1 <= M <= 100,000)이 주어진다.
셋째 줄부터 M개의 줄에 간선과 가중치에 대한 정보가 주어지고 이때 가중치의 크기는 0 <= C <= 100,000이다.
마지막 줄에 출발점 A와 도착점 B가 주어진다.
예제 입력
5
8
1 2 2
1 3 3
1 4 1
1 5 10
2 4 2
3 4 1
3 5 1
4 5 3
1 5
예제 출력
4
어디서 힌트를 얻을 수 있을까?
문제에서 정점, 간선, 가중치, 그리고 최소 비용이라는 단어를 통해 이 문제는 다익스트라 알고리즘을 이용하여 문제를 풀 수 있다는 것을 알 수 있다. 이때 가중치의 비용은 자연수이므로 다익스트라의 음수를 포함하지 못한다는 문제점을 고려할 필요가 없었다.
단순히 다익스트라를 구현할 수 있냐 없냐의 문제이기 때문에 코드는 다음과 같다.
#include <iostream>
#include <queue>
#include <vector>
typedef std::pair<int, int> P;
std::vector<P> varr[1001];
long long dist[1001];
long long INF = 999987654321;
void Dijkstra(int S)
{
std::priority_queue<P > pq;
pq.push(P(0, S));
dist[S] = 0;
while (!pq.empty())
{
int here = pq.top().second;
int cost = -pq.top().first;
pq.pop();
if (cost > dist[here])
continue;
for (int i = 0; i < varr[here].size(); i++)
{
int there = varr[here][i].first;
int nCost = cost + varr[here][i].second;
if (dist[there] > nCost)
{
dist[there] = nCost;
pq.push(P(-nCost, there));
}
}
}
}
int main(void)
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
int N, M;
std::cin >> N >> M;
for (int i = 0; i < M; i++)
{
int X, Y, C;
std::cin >> X >> Y >> C;
varr[X].push_back(P(Y, C));
}
for (int i = 0; i < N + 1; i++)
dist[i] = INF;
int S, D;
std::cin >> S >> D;
Dijkstra(S);
std::cout << dist[D] << std::endl;
return 0;
}
https://www.acmicpc.net/problem/1916
1916번: 최소비용 구하기
첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그
www.acmicpc.net
다익스트라(Dijkstra) 알고리즘
다익스트라(Dijkstra) 알고리즘은 그래프 이론을 활용한 대표적인 최단 경로(Shortest Path)탐색 알고리즘이다. 이 알고리즘은 특정한 하나의 정점에서 다른 모든 정점으로 가는 최단 경로를 구할 수
deulee.tistory.com
백준 1932 - 정수 삼각형(C++) (0) | 2023.05.24 |
---|---|
백준 1918 - 후위 표기식(C++) (0) | 2023.05.24 |
백준 1865 - 웜홀(C++) (0) | 2023.05.23 |
백준 12930 - 두 가중치(C++) (0) | 2023.05.23 |
백준 1753 - 최단경로(C++) (0) | 2023.05.22 |