最短路径算法–Dijkstra算法
算法思路:
先加入一个节点作为初始结点,然后每轮添加一个节点,这样n - 1轮后就可以得到从初始结点到所有结点的最小距离。
这里我们要用到三个辅助数组:S[i]、path[i]、dist[i],他们分别用来记录结点i是否已经加入到最短路径、加入的结点i的前驱结点、初始结点到结点i的距离。
接下来我们初始化三个数组,S[i]数组初始化全为0,加入初始结点0,S[0] = 1;path[i]数组初始化全为0,表示他们的前驱结点都是0结点,而0结点无前驱结点,path[0] = -1;dist[i]数组初始化的值为初始结点0到i结点的距离。
接下来循环n - 1次,每次都找到当前dist[i]数组中最小的值,把i结点添加到最短路径中且标记S[i] = 1,然后从新添加的i结点去查找它的出边,如果有出边,若出边的边长加上到新加入的i结点的距离小于初始结点到出边结点的距离,则更新初始结点到出边结点的最短距离以及到出边结点的前驱结点,这样执行n - 1轮,S[i]数组的值全变成1,这样就得到了我们就得到从初始结点到其他所有结点的最短距离以及路径。
代码实现:
#include<iostream>
using namespace std;
#define MaxVertexNum 10//定义最大数组
#define MAX 10000//最大值
typedef char VertexType;//结点名称的类型
typedef int EdgeType;//结点权重的类型
typedef struct{
//图的结构体
VertexType Vex[MaxVertexNum];//结点数组
EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵--权值的二维数组
int vexnum, arcnum;//节点数、边数
}Graph;//结构体的名称
void Dijkstra(Graph G, int v){
//v为选择的初始结点的下标,该算法可以算出初始结点即下标为j的结点到图的其他结点的最短路径
int s[G.vexnum];//辅助数组--用来记录结点是否被选择
int path[G.vexnum];//辅助数组--用来记录初始结点到每个结点的最短路径的前驱结点
int dist[G.vexnum];//辅助数组--用来记录初始结点到每个结点的最短距离
for(int i = 0; i < G