[적용한 알고리즘]

다익스트라 알고리즘

 

[아이디어]

다익스트라의 기본적인 문항이라고 한다.

다만 각 칸 자체가 cost 로 봐줘야한다.

 

[생각의 흐름 / 절차] 

내용

 

[교훈]

근데 저 알고리즘인지 몰랐다면, 아직 허접인 나는 이게 

DP 문제인 줄 알았을 것 같다. 어디서 차이를 알아야하는 거지?

 

<코드>

#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int MAX = 126;
const int INF = 1000000000;

int dirx[] = {-1, 1, 0, 0};
int diry[] = {0, 0 ,1, -1};
int n;
struct Ver{
    int x, y, dist;
    bool operator < (const Ver &v) const{
        return dist > v.dist;
    }
};

bool inMap(int x, int y){
    if (1 <= x && x <= n && 1 <= y && y <= n) return true;
    return false;
}

int main(){
    int t = 0;
    while (true){
        t++;
        bool visited[MAX][MAX] = { 0 };
        int map[MAX][MAX] = { 0 };
        int dist[MAX][MAX] = { 0 };

        scanf("%d", &n);
        if (n == 0) return 0;
        for (int i = 1; i <= n; i++){
            for (int j = 1; j <= n; j++){
                scanf("%d", &map[i][j]);
                dist[i][j] = INF;
            }
        }

        dist[1][1] = map[1][1];
        priority_queue<Ver> PQ;
        PQ.push({1, 1, dist[1][1]});

        while (!PQ.empty()){
            Ver cur;

            do {
                cur = PQ.top();
                PQ.pop();
            } while (!PQ.empty() && visited[cur.x][cur.y]);

            if (visited[cur.x][cur.y]) break;
            visited[cur.x][cur.y] = true;

            for (int k = 0; k < 4; k++){
                int nx = cur.x + dirx[k];
                int ny = cur.y + diry[k];

                if (inMap(nx, ny) && !visited[nx][ny]){
                    if (dist[nx][ny] > dist[cur.x][cur.y] + map[nx][ny]){
                        dist[nx][ny] = dist[cur.x][cur.y] + map[nx][ny];
                        PQ.push({nx, ny, dist[nx][ny]});
                    }
                }
            }
        }
        printf("Problem %d: %d\n", t, dist[n][n]);
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

[백준] 1261번 알고스팟  (0) 2019.11.28
[백준] 1238번 파티  (0) 2019.11.28
[백준] 1753번 최단경로  (0) 2019.11.27
[백준] 12738번 가장 긴 증가하는 부분 수열 3  (0) 2019.11.23
[백준] 1365번 꼬인 전깃줄  (0) 2019.11.23

+ Recent posts