본문 바로가기

알고리즘/BOJ

13549번

13549번 - 숨바꼭질3


이 문제는 각 점을 정점으로 하고, 가중치가 다르기 때문에


BFS가 아닌 다익스트라 알고리즘을 이용해서 풀 수 있다.


나는 우선 순위 큐를 이용한 다익스트라를 이용해서 문제를 풀었다.


<정답 코드>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
 
const int INF = 987654321;
int main()
{
    int n, k;
    scanf("%d%d"&n, &k);
 
    vector<int> dist(100001, INF);
 
    priority_queue<pair<intint>> q;
    dist[n] = 0;
    q.push({ dist[n], n });
 
    while (!q.empty())
    {
        int w = -q.top().first;
        int now = q.top().second;
        q.pop();
 
        if (dist[now] < w)
        {
            continue;
        }
 
        int next = now + 1;
        if (next <= 100000)
        {
            int cost = 1;
            if (dist[next] > dist[now] + cost)
            {
                dist[next] = dist[now] + cost;
                q.push({ -dist[next],next });
            }
        }
        
        next = now - 1;
        if (next >= 0)
        {
            int cost = 1;
            if (dist[next] > dist[now] + cost)
            {
                dist[next] = dist[now] + cost;
                q.push({ -dist[next],next });
            }
        }
 
        next = now * 2;
        if (next <= 100000)
        {
            int cost = 0;
            if (dist[next] > dist[now] + cost)
            {
                dist[next] = dist[now] + cost;
                q.push({ -dist[next],next });
            }
        }
    }
 
    printf("%d\n", dist[k]);
 
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

12851번  (0) 2018.01.28
9328번  (3) 2018.01.27
13398번  (0) 2018.01.27
11438번  (0) 2018.01.26
2143번  (0) 2018.01.25