๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] 13549 ์ˆจ๋ฐ”๊ผญ์งˆ 3 dijkstra

by Jouureee 2022. 2. 17.

๋ฌธ์ œ :

https://www.acmicpc.net/problem/13549

 

13549๋ฒˆ: ์ˆจ๋ฐ”๊ผญ์งˆ 3

์ˆ˜๋นˆ์ด๋Š” ๋™์ƒ๊ณผ ์ˆจ๋ฐ”๊ผญ์งˆ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” ํ˜„์žฌ ์  N(0 ≤ N ≤ 100,000)์— ์žˆ๊ณ , ๋™์ƒ์€ ์  K(0 ≤ K ≤ 100,000)์— ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” ๊ฑท๊ฑฐ๋‚˜ ์ˆœ๊ฐ„์ด๋™์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ, ์ˆ˜๋นˆ์ด์˜ ์œ„์น˜๊ฐ€ X์ผ

www.acmicpc.net

 

ํ’€์ด :

์ˆจ๋ฐ”๊ผญ์งˆ1 ๋ฌธ์ œ์™€ ๋‹ฌ๋ฆฌ ์ด๋ฒค์—๋Š” ์ˆœ๊ฐ„์ด๋™(M x 2)์‹œ ์‹œ๊ฐ„์€ 0์ดˆ๋ผ๋Š” ์กฐ๊ฑด์ด ๋‹ค๋ฅด๋‹ค. ์ฆ‰ ๊ฑท๊ธฐ(M-1, M+1) ์กฐ๊ฑด์‹œ์˜ ๊ฐ€์ค‘์น˜์™€ ์ˆœ๊ฐ„์ด๋™์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ๋‹ฌ๋ผ ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„  ์ˆœ๊ฐ„์ด๋™์ด ์šฐ์„ ์‹œ ๋˜์–ด์•ผ ํ–ˆ๊ณ 

๊ฑฐ๋ฆฌ๊ฐ€ ์ž‘์€์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์ฃผ๋Š” ์šฐ์„ ์ˆœ์œ„ํ๋ฅผ ์‚ฌ์šฉํ•ด ๋‹ค์ต์Šคํฌ๋ผ๋ฅผ ์ ์šฉํ–ˆ๋‹ค.

๊ฐ€์ง€ ์•Š์•˜๋˜ ์œ„์น˜๊ฑฐ๋‚˜ ๋˜๋Š” ์ „์— ๊ฐ”์„๋•Œ์˜ ์‹œ๊ฐ„๋ณด๋‹ค ๋” ์ ๊ฒŒ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์žˆ๋‹ค๋ฉด ๊ทธ ์‹œ๊ฐ„๊ฐ’์œผ๋กœ d ๋ฐฐ์—ด์„ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์–ด ์ตœ์†Œ ์‹œ๊ฐ„(๋น„์šฉ)์„ ์ฐพ์•˜๋‹ค.

 

c++ ์ฝ”๋“œ :

//
//  13549_hide_seek3.cpp
//  SOMA๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
//
//  Created by JoSoJeong on 2022/02/17.
//


#include <iostream>
#include <queue>
#include <string.h>

using namespace std;
int N, K;
int moving[3] = { - 1, 1, 2}; //walk, jump

int d[100001]; // ์ตœ๋‹จ ์‹œ๊ฐ„ ํ…Œ์ด๋ธ”
int n_now; // ๋‹ค์Œ ์œ„์น˜
int n_t; // ๋‹ค์Œ ์œ„์น˜์‹œ์˜ ์‹œ๊ฐ„

void hide_seek_minTime() {
    priority_queue<pair<int, int>> pq; //์‹œ๊ฐ„, ์œ„์น˜
    pq.push({0, N});
    d[N] = 0;
    
    while(!pq.empty()){
        int t = -pq.top().first;
        int now = pq.top().second;
        pq.pop();
        
        for(int i = 0; i < 3; i++){
            if(i == 2) {
                n_now = moving[i] * now;
                n_t = t;
            }else {
                n_now = moving[i] + now;
                n_t = t + 1;
            }
            
            if(n_now < 0 || n_now > 100000) continue; // ๋ฒ”์œ„
            
            if(d[n_now] == -1 || d[n_now] > n_t) { // ๊ฐ€์ง€ ์•Š์€ ๊ธธ or ๋” ์‹œ๊ฐ„ ์ ๋‹ค๋ฉด
                d[n_now] = n_t;
                pq.push({-n_t, n_now});
            }
        }
        
    }
    
}

int main(){
    cin >> N >> K;
    memset(d, -1, sizeof(d));
    
    hide_seek_minTime();
    cout << d[K] << '\n'; // K์œ„์น˜๊นŒ์ง€ ์—…๋ฐ์ดํŠธ๋œ ์‹œ๊ฐ„
    return 0;
}

 

 

 

์ฐธ๊ณ  :

https://excited-hyun.tistory.com/33

 

๋Œ“๊ธ€