다익스트라 연습중
13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
초(시간) 에 해당하는걸 간선의 가중치로, 각각의 점 위치를 노드로 보면
그래프에서의 N번 노드에서 K번 노드까지의 가중치의 최소값을 구해주면 되므로 다익스트라로
해결할 수 있다.
단순한 다익스트라에, 간선조건조차 그리 어려운 편이 아니므로
자세한 설명은 생략해도 괜찮을 것 같다.
더보기
#include <bits/stdc++.h>
#define INF 123456789
using namespace std;
priority_queue<pair<int,int>> pq;
int d[123456] = {0};
void dijkstra(int node){
for(int i=0; i<123456; i++) d[i] = INF;
d[node] = 0;
pq.push({0,node});
while(!pq.empty()){
int now = pq.top().second;
int dir = -pq.top().first;
pq.pop();
if(0 <= 2*now && 2*now <= 100000){
if(d[2*now] > dir){
d[2*now] = dir;
pq.push({-dir, 2*now});
}
}
if(0 <= now+1 && now+1 <= 100000){
if( d[now+1] > dir + 1 ){
d[now+1] = dir + 1;
pq.push({-(dir+1), now+1});
}
}
if(0 <= now-1 && now-1 <= 100000){
if( d[now-1] > dir + 1 ){
d[now-1] = dir + 1;
pq.push({-(dir+1), now-1});
}
}
}
return;
}
int main(){
int n,k;
scanf("%d %d", &n, &k);
dijkstra(n);
printf("%d", d[k]);
return 0;
}
반응형