문제
1446번: 지름길
첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하인 양의 정수이고, D는 10,000보다 작거나 같은 자연수이다. 다음 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이
www.acmicpc.net
풀이
다익스트라 문제이다.
- 도로를 하나의 그래프로 생각하는데 주목한다. 그래프의 노드는 바로 다음 노드와 거리가 1로 연결되어 있다.
- 위의 그래프에서 입력 받은 지름길을 추가한다.
- 역주행 할 수 없으므로, 지름길의 끝이 D를 넘어간다면 그래프에 추가하지 않는다.
- 지름길의 거리가 시작과 끝의 거리보다 길다면, 거리를 줄일 수 없으므로 그래프에 추가하지 않는다.
- 그래프를 0에서부터 다익스트라를 통해 D까지의 최소 거리를 구한다.
코드
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
vector<vector<pair<int, int>>> edges;
vector<int> dist;
void dijkstra(int start)
{
dist[start] = 0;
priority_queue<pair<int, int>> pq;
pq.push(make_pair(0, start));
while (!pq.empty())
{
int current_node = pq.top().second;
int current_dist = (-1) * pq.top().first;
pq.pop();
if (dist[current_node] < current_dist)
{
continue;
}
for (auto edge : edges[current_node])
{
int next_node = edge.second;
int next_dist = edge.first + current_dist;
if (next_dist < dist[next_node])
{
dist[next_node] = next_dist;
pq.push(make_pair((-1) * next_dist, next_node));
}
}
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
int N, D;
cin >> N >> D;
edges.resize(D + 1);
dist.resize(D + 1, INT_MAX);
// 도로를 특정 노드가 다음 노드와 거리 1로 연결된 그래프라고 생각한다.
for (int i = 0; i < D; ++i)
{
edges[i].push_back(make_pair(1, i + 1));
}
// 지름길을 추가한다.
vector<int> starts;
for (int i = 0; i < N; ++i)
{
int start, end, distance;
cin >> start >> end >> distance;
// 역주행 할 수는 없으므로 end가 D를 초과한 경우에는 edges에 넣지 않는다.
// 거리를 줄일 수 없는 지름길은 edges에 넣지 않는다.
if (end <= D && (end - start) > distance)
{
starts.push_back(start);
edges[start].push_back(make_pair(distance, end));
}
}
dijkstra(0);
cout << dist[D];
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준][C++] 2211: 네트워크 복구 (1) | 2023.12.17 |
---|---|
[백준][C++] 1719: 택배 (1) | 2023.12.17 |
[백준][C++] 9370: 미확인 도착지 (0) | 2023.12.14 |
[백준][C++] 10282: 해킹 (0) | 2023.12.14 |
[백준][C++] 4485: 녹색 옷 입은 애가 젤다지? (0) | 2023.12.11 |