Featured image of post 💦簡易 Dijkstra

💦簡易 Dijkstra

圖解 Dijkstra 演算法🍾

Dijkstra Note


以走迷宮圖的最短路徑為例 https://zerojudge.tw/ShowProblem?problemid=d793

在 hackmd ㄉ: https://hackmd.io/@UltraGeek/Sy6vIEqvI

 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
#include <bits/stdc++.h>
using namespace std;

typedef struct Node {
    int i;
    int j;
    int dis;
    bool operator<(const Node& a) const {
        return a.dis < dis;
    }
} node;

int ta, N, M;  // taskAmount
int maze[1000][1000];
int dis[1000][1000];
bool flag[1000][1000];
int mv[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
priority_queue<node> dispq;

void dijsktra() {
    while (!dispq.empty()) {
        flag[dispq.top().i][dispq.top().j] = true;
        for (int k = 0; k < 4; k++) {
            node nn;  //nextNode
            nn.i = dispq.top().i + mv[k][0];
            nn.j = dispq.top().j + mv[k][1];
            nn.dis = dis[nn.i][nn.j];
            if ((nn.i < N && nn.i >= 0) && (nn.j < M && nn.j >= 0) && (!flag[nn.i][nn.j])) {
                if (dispq.top().dis + maze[nn.i][nn.j] < nn.dis) {
                    nn.dis = dispq.top().dis + maze[nn.i][nn.j];
                    dispq.push(nn);
                    dis[nn.i][nn.j] = nn.dis;
                }
            }
        }
        dispq.pop();
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr);
    cin >> ta;
    while (ta--) {
        //int p[1000][1000];
        cin >> N >> M;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                cin >> maze[i][j];
                flag[i][j] = 0;
                dis[i][j] = 9999999;
            }
        }
        node n = {0, 0, maze[0][0]};
        dis[0][0] = maze[0][0];
        dispq.push(n);

        dijsktra();
        cout << dis[N - 1][M - 1] << '\n';
    }
}

03129
73499
17553
23425

03INFINFINF
7INFINFINFINF
INFINFINFINFINF
INFINFINFINFINF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (0 , 1) ,距離: 3


03129
73499
17553
23425

034INFINF
76INFINFINF
INFINFINFINFINF
INFINFINFINFINF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (0 , 2) ,距離: 4


03129
73499
17553
23425

0346INF
768INFINF
INFINFINFINFINF
INFINFINFINFINF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (1 , 1) ,距離: 6


03129
73499
17553
23425

0346INF
768INFINF
INF13INFINFINF
INFINFINFINFINF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (0 , 3) ,距離: 6


03129
73499
17553
23425

034615
76815INF
INF13INFINFINF
INFINFINFINFINF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (1 , 0) ,距離: 7


03129
73499
17553
23425

034615
76815INF
813INFINFINF
INFINFINFINFINF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (2 , 0) ,距離: 8


03129
73499
17553
23425

034615
76815INF
813INFINFINF
10INFINFINFINF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (1 , 2) ,距離: 8


03129
73499
17553
23425

034615
76815INF
81313INFINF
10INFINFINFINF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (3 , 0) ,距離: 10


03129
73499
17553
23425

034615
76815INF
81313INFINF
1013INFINFINF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (2 , 2) ,距離: 13


03129
73499
17553
23425

034615
76815INF
8131318INF
101317INFINF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (3 , 1) ,距離: 13


03129
73499
17553
23425

034615
76815INF
8131318INF
101317INFINF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (2 , 1) ,距離: 13


03129
73499
17553
23425

034615
76815INF
8131318INF
101317INFINF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (1 , 3) ,距離: 15


03129
73499
17553
23425

034615
7681524
8131318INF
101317INFINF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (0 , 4) ,距離: 15


03129
73499
17553
23425

034615
7681524
8131318INF
101317INFINF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (3 , 2) ,距離: 17


03129
73499
17553
23425

034615
7681524
8131318INF
10131719INF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (2 , 3) ,距離: 18


03129
73499
17553
23425

034615
7681524
813131821
10131719INF

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (3 , 3) ,距離: 19


03129
73499
17553
23425

034615
7681524
813131821
1013171924

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (2 , 4) ,距離: 21


03129
73499
17553
23425

034615
7681524
813131821
1013171924

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (3 , 4) ,距離: 24


03129
73499
17553
23425

034615
7681524
813131821
1013171924

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (1 , 4) ,距離: 24


03129
73499
17553
23425

034615
7681524
813131821
1013171924

透過綠色這格更新旁邊的紅色格ㄉ最短路徑,再從所有格子中挑選未走過且路徑最短者繼續尋找 ,即格子: (1 , 4) ,距離: 24


💜
使用 Hugo 建立
主題 StackJimmy 設計