1. 程式人生 > >學習筆記:迪傑斯特拉算法

學習筆記:迪傑斯特拉算法

最短 重復 con cin main 單源最短路徑算法 路徑 class bool

一、算法概要

1.迪傑斯特拉算法是典型的單源最短路徑算法。

2.主要特點是以起始點為中心向外擴展,直到擴展至終點為止。

二、算法步驟

1.將圖中的頂點劃分為兩組,第一組為已求出最短路徑的頂點,第二組為未確定最短路徑的頂點。

2.初始時,第一組只包含起始點。

3.從第一組中選擇最近一次加入的頂點,找到該頂點在第二組中最近的鄰接點。以該鄰接點為中心點更新各點到起始點的距離,若從起始點經過該鄰接點到達任意頂點的距離小於原來的距離,則更新之。若更新則更新的距離為 起始點到鄰接點的距離+鄰接點到該任意頂點的距離。

4.重復上一步直至所有第二組中的頂點都加入第一組。

三、代碼實現

註意:無窮大若取INT_MAX,INT_MAX + INT_MAX會因為位溢出而變成負無窮。

#include <iostream>
#include <algorithm>

const int maxn = 100;
const int inf = 1061109567;
int n, m;
int g[maxn][maxn];
bool vis[maxn];
int dis[maxn];

int dijkstra(int v1, int v2) {
    for (int i = 1; i <= n; i++) {
        vis[i] = false;
        dis[i] = g[v1][i];
    }
    vis[v1] 
= true; dis[v1] = 0; for (int i = 1; i <= n; i++) { int min = inf; int k = 0; for (int j = 1; j <= n; j++) if (!vis[j] && dis[j] < min) { min = dis[j]; k = j; } vis[k] = true; for (int
j = 1; j <= n; j++) if (!vis[j]) dis[j] = std::min(dis[j], dis[k] + g[k][j]); } return dis[v2]; } int main() { std::cin >> n >> m; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) g[i][j] = inf; for (int i = 0; i < m; i++) { int v1, v2, w; std::cin >> v1 >> v2 >> w; g[v1][v2] = w; g[v2][v1] = w; } return 0; }

學習筆記:迪傑斯特拉算法