基本思路
1、维护一个距离表数组dis,dis[i] 表示通过已访问节点从起点到节点i 的最短路径。
2、每次访问dis最小、且未访问的节点,更新dis表。
例子
用邻接矩阵graph存储:
过程演示
1、初始起点0为已访问,同时初始dis表
2、dis[2]最小且节点2未访问,故访问节点2,并更新dis表。节点2和节点3、5邻接,且节点3、5未访问,且通过节点2到达节点3、5
路径更短,故更新dis[3]、dis[5]。
2、dis[1]最小且节点1未访问,故访问节点1,并更新dis表。节点1和节点3、4邻接,且节点3、4未访问,且通过节点1到达节点3、4
路径更短,故更新dis[3]、dis[4]。
3、重复上述步骤直到访问完所有节点。
代码
const int cnt = 7;
void Dijkstra(int graph[][cnt])
{
int dis[cnt] = {INT_MAX}; // 距离表
bool visited[cnt] = {0}; // 访问标记
// 初始化
visited[0] = true; // 节点0标记为已访问
for (int i = 1; i < cnt; i++) // 遍历更新距离表
dis[i] = graph[0][i];
for (int i = 1; i < cnt; i++)
{
// 查找未被访问节点距离表中的最小值
int minIndex = 0; // 距离表最小值下标
for (int j = 1; j < cnt; j++)
{
if (!visited[j] && dis[j] < dis[minIndex])
minIndex = j;
}
visited[minIndex] = true;
// 更新距离表
for (int k = 1; k < cnt; k++)
{
if (!visited[k] && graph[minIndex][k] < INT_MAX && graph[minIndex][k] + dis[minIndex] < dis[k])
dis[k] = graph[minIndex][k] + dis[minIndex];
}
}
}