문제
https://www.acmicpc.net/problem/13549
걸린 시간
-
풀이
C++
#include <bits/stdc++.h>
#define INF 1e9
#define all(c) c.begin(), c.end()
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int N, K;
cin >> N >> K;
vector<int> dist(200001, INF);
priority_queue<pii> pq;
pq.push({0, N});
dist[N] = 0;
while(!pq.empty()){
int cost = -pq.top().first;
int here = pq.top().second;
pq.pop();
pii adj[3] = {{here-1, 1}, {here+1, 1}, {here*2, 0}};
for(int i = 0; i < 3; i++){
int there = adj[i].first;
int nextDist = cost + adj[i].second;
if(there < 200001 && nextDist < dist[there]){
dist[there] = nextDist;
pq.push({-nextDist, there});
}
}
}
cout << dist[K] << "\n";
return 0;
}
좌우로 이동하려면 1초가 걸리지만 순간이동에는 시간이 소요되지 않는다. 이는 간선의 가중치가 다른 최단 경로 찾기 문제이므로 다익스트라 알고리즘을 적용하면 해결할 수 있다.
간선의 가중치가 0과 1로 만 이루어져 있기 때문에 0-1 bfs 알고리즘을 사용해서도 풀이할 수 있다고 한다.
'Baekjoon' 카테고리의 다른 글
Baekjoon 3221번 개미의 이동 (0) | 2021.09.30 |
---|---|
Baekjoon 11725번 트리의 부모 찾기 (0) | 2021.09.17 |
Baekjoon 1411번 비슷한 단어 (0) | 2021.07.26 |
Baekjoon 2615번 오목 (0) | 2021.05.16 |
Baekjoon 1914번 하노이 탑 (0) | 2021.05.15 |
댓글