https://www.acmicpc.net/problem/13549
해당 문제는 최단 거리를 구하는 문제로, 다익스트라 알고리즘을 사용하여 풀이했다.
1) 수빈이의 현재 위치 n
과 동생의 위치 k
를 입력 받아 저장한다.
=> 이 때 n
은 시작점, k
는 목표 지점, 각 위치 지점들을 노드로 볼 수 있다.
2) 시작점에서 각 위치까지 최단 거리를 저장하는 배열 dp
를 선언하고, dp
의 모든 값을 무한대로 초기화한다.
3) 다익스트라 알고리즘을 실행하여 시작점에서부터 각 위치까지의 최단 거리를 구한다.
pq
를 선언하고, 오름차순으로 정렬되도록 한다.pq
에는 노드 정보 (해당 노드까지 최소 거리, 노드 번호)가 저장된다.pq
에 (0, 시작 위치)를 삽입한다.pq
가 빌 때까지 아래 과정을 반복한다.dist
: 현재 노드까지의 거리cur
: 현재 노드의 번호cost
에 현재 노드까지의 거리 + 현재 노드 ~ 이동했을 때 거리를 저장한다.pq
에 삽입한다.4) 위 과정이 끝나면 dp
에는 시작점부터 다른 노드까지의 최소 거리들이 저장된다.
이 때, 동생의 위치 k
까지의 최단 거리를 알고 싶은 것이기 때문에 dp[k]를 출력한다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <tuple>
using namespace std;
typedef pair<int, int> pii;
int n, k;
int dp[100001];
const long long INF = 1e9;
pii move(int cur, int i)
{
if (i == 0)
return pii(cur - 1, 1);
else if (i == 1)
return pii(cur + 1, 1);
else
return pii(cur * 2, 0);
}
void dijkstra(int start)
{
priority_queue<pii, vector<pii>, greater<pii>> pq;
pq.push(pii(0, start));
dp[start] = 0;
while (!pq.empty())
{
int dist = pq.top().first;
int cur = pq.top().second;
pq.pop();
if (dp[cur] < dist) continue;
for (int i = 0; i < 3; i++)
{
pii curEdge = move(cur, i);
int cost = dist + curEdge.second;
if (curEdge.first >= 0 && curEdge.first <= 100000 && cost < dp[curEdge.first])
{
dp[curEdge.first] = cost;
pq.push(pii(cost, curEdge.first));
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cin >> n >> k;
fill(dp, dp + 100001, INF);
dijkstra(n);
cout << dp[k];
}