Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dijkstra Algorithm - 立人高中程設培訓

Dijkstra Algorithm - 立人高中程設培訓

Avatar for Yuxin Zhou

Yuxin Zhou

August 16, 2013

Other Decks in Technology

Transcript

  1. 概念 • 單點對全點最短路徑 • 效率 O(|V|2) 普普 • 從起點開始往外找最短的點 •

    最短的點再找跟他距離最短的點 • 可能會有多種路徑到該點, • 要取較小值
  2. 輸入 • 要先把二維陣列通通設為 INF • 將 Dist 陣列通通設為 INF •

    將 Visit 陣列通通設為 False • INF = 2147483647 (int 最大值)
  3. 程式碼 #include <cstdio> #include <cstring> … const int INF =

    2147483647; for ( int i = 0; i < N ; i++ ){ dist[i] = INF; } memset( visit, 0, sizeof(visit) ); for ( int i = 0; i < N ; i++ ){ for ( int j = 0; j < N ; j++ ){ map[i][j] = INF; } }
  4. 程式碼 s = 0; dist[s] = 0; while ( 1

    ) { int v = -1; for ( int i = 0 ; i < N ; i++ ) { if ( !visit[i] && ( v == -1 || dist[i] < dist[v] ) v = i ; // 如果還可以走 } if ( v == -1 ) break; // 走完了 visit[v] = true; // 走過 for ( int i = 0 ; i < N ; i++ ) { dist[i] = min ( dist[i], dist[v] + map[v][i] ); // 原本的比較短 or 新的最短路比較短 } }
  5. 0 1 2 3 4 5 0 INF 4 7

    INF INF INF 1 4 INF 2 6 INF INF 2 7 2 INF 1 8 INF 3 INF 6 1 INF 4 3 4 INF INF 8 4 INF 10 5 INF INF INF 3 10 INF 1 3 0 2 5 4 4 7 6 2 1 4 3 10 8 0 1 2 3 4 5 0 INF INF INF INF INF
  6. 0 1 2 3 4 5 0 INF 4 7

    INF INF INF 1 4 INF 2 6 INF INF 2 7 2 INF 1 8 INF 3 INF 6 1 INF 4 3 4 INF INF 8 4 INF 10 5 INF INF INF 3 10 INF 1 3 0 2 5 4 4 7 6 2 1 4 3 10 8 0 1 2 3 4 5 0 4 INF INF INF INF
  7. 0 1 2 3 4 5 0 INF 4 7

    INF INF INF 1 4 INF 2 6 INF INF 2 7 2 INF 1 8 INF 3 INF 6 1 INF 4 3 4 INF INF 8 4 INF 10 5 INF INF INF 3 10 INF 1 3 0 2 5 4 4 7 6 2 1 4 3 10 8 0 1 2 3 4 5 0 4 6 INF INF INF
  8. 0 1 2 3 4 5 0 INF 4 7

    INF INF INF 1 4 INF 2 6 INF INF 2 7 2 INF 1 8 INF 3 INF 6 1 INF 4 3 4 INF INF 8 4 INF 10 5 INF INF INF 3 10 INF 1 3 0 2 5 4 4 7 6 2 1 4 3 10 8 0 1 2 3 4 5 0 4 6 7 INF INF
  9. 0 1 2 3 4 5 0 INF 4 7

    INF INF INF 1 4 INF 2 6 INF INF 2 7 2 INF 1 8 INF 3 INF 6 1 INF 4 3 4 INF INF 8 4 INF 10 5 INF INF INF 3 10 INF 1 3 0 2 5 4 4 7 6 2 1 4 3 10 8 0 1 2 3 4 5 0 4 6 7 11 INF
  10. 0 1 2 3 4 5 0 INF 4 7

    INF INF INF 1 4 INF 2 6 INF INF 2 7 2 INF 1 8 INF 3 INF 6 1 INF 4 3 4 INF INF 8 4 INF 10 5 INF INF INF 3 10 INF 1 3 0 2 5 4 4 7 6 2 1 4 3 10 8 0 1 2 3 4 5 0 4 6 7 11 10
  11. 程式碼 s = 0; dist[s] = 0; while ( 1

    ) { int v = -1; for ( int i = 0 ; i < N ; i++ ) { if ( visit[i] == false && ( v == -1 || dist[i] < dist[v] ) v = i ; // 如果還可以走 } if ( v == -1 ) break; // 走完了 visit[v] = true; // 走過 for ( int i = 0 ; i < N ; i++ ) { dist[i] = min ( dist[i], dist[v] + map[v][i] ); // 原本的比較短 or 新的最短路比較短 } }