一、算法概要
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; }