定义
Dijkstra迪杰斯特拉算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法。
指定顶点A到其他所有顶点的最短路径全部求出来
- 没法直接到达设为最大INF
- 我们每一次在U集合中找到最小的放在S集合中
- 加入S结合后,选择更新U集合中剩余顶点的权值信息
- 重复上面的步骤,直到U集合为空
- 若 dis[i]>min+graph[k][i],修改
- 无法处理负权边,有可能得不到最短的路径
#include<iostream>
#include <vector>
using namespace std;
using uint = unsigned int;
const uint INF = INT_MAX;
int Dijkstra(vector<vector<uint>>& graph,int start,int end)
{
const int N = graph.size();
//存储各个顶点的最短路径(最小权值)
vector<uint> dis(N, 0);
vector<bool> use(N, false);
//把start放在s集合
use[start] = true;
//初始化start到其他U集合顶点权值
for (int i = 0; i < N; i++)
{
dis[i] = graph[start][i];
}
//把U集合中的顶点处理完
for (int i = 1; i < N; i++)
{
int k = -1;
int min = INF;
for (int j = 0; j < N; j++)
{
if (!use[j] && min > dis[j])//U集合的顶点
{
min = dis[j];
k = j;
}
}
if (k == -1)
{
break;
}
//把选出的顶点加入到s集合中
use[k] = true;
//把U集合中剩余顶点的权值信息更新一下
for (int j = 0; j < N; j++)
{
if (!use[j] && min + graph[k][j] < dis[j])//U集合不为空并且满足条件
{
dis[j] = min + graph[k][j];
}
}
}
//测试打印
for (int d : dis)
{
cout << d << " ";
}
cout << endl;
return dis[end];
}
int main()
{
vector<vector<uint>> graph =
{
{0,6, 3, INF, INF, INF},
{6,0, 2, 5, INF, INF},
{3, 2, 0, 3, 4, INF},
{INF, 5, 3, 0, 2, 3},
{INF, INF, 4, 2, 0, 5},
{INF, INF, INF, 3, 5, 0}
};
int distance = Dijkstra(graph, 0, 3);
cout << "最短路径:" << distance << endl;
}