學習筆記:迪傑斯特拉算法
阿新 • • 發佈:2018-01-04
最短 重復 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 (intj = 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; }
學習筆記:迪傑斯特拉算法