前言
迪杰斯特拉(dijisktra)算法是比较常用的最短路径算法之一,也是最为重要的,很多操作需要在它的基础上进行改动。在这里不对原理进行讲解,仅对代码进行提炼和总结,基础不是很好的同学还请自行翻阅《数据结构》教材。
注:本文的实验案例都是清华大学严蔚敏老师数据结构视频中所讲解的案例,所以本类的文章是十分适合大家对课上知识加深认识的。测试案例和源代码将会在文末给出。
算法
本算法的存储结构为邻接矩阵,类型声明如下:
typedef struct _graph {
int matrix[MAX][MAX];//二维数组表示的矩阵
char vexs[MAX];//顶点集
int vexnum;//顶点个数
int edgnum;//边的个数
}Graph, *pGraph;//邻接矩阵的存储结构,用pGraph指针指向
下面是算法
void DJS(Graph* pgra, char ch) {
int v0 = getPosition(pgra, ch);//得到该节点在邻接矩阵中的位置
int vexnum = pgra->vexnum;//顶点个数
bool* S = new bool[vexnum] {false};//S集,初始化为未选中
int* dist = new int[vexnum];//dist集合,存放的是到当前节点的路径
int* path = new int[vexnum];//到该节点最短路径的节点信息
S[v0] = true;//把该节点移除S集
dist[v0] = 0;
//初始化
for (int v = 0; v < vexnum; v++) {
dist[v] = pgra->matrix[v0][v];
if (dist[v] != INF) {//此时有路径
path[v] = v0;
}
}
//对剩余的n-1个节点逐一求最短路径
for (int i = 1; i < vexnum - 1; i++) {//相当于计数器
int min = INF;
int v;
//从S集合中任选一个进行试探
for (int w = 0; w < vexnum; w++) {
if (!S[w] && dist[w] < min) {//再从dist里面选取一条最短的
min = dist[w];
v = w;//把该节点记录下来
}
}
S[v] = true;//把该点移除S集
//更新其他节点的最短路径
for (int w = 0; w < vexnum; w++) {
if (!S[w] && dist[v] + pgra->matrix[v][w] < dist[w]) {
dist[w] = dist[v] + pgra->matrix[v][w];
path[w] = v;
}
}
}
}
上机须知
对应的邻接矩阵
0 15 2 10 * * *
* 0 * * 6 * *
* * 0 * 7 4 *
* * * 0 * * 4
* * * * 0 * 9
* * * 5 * 0 10
* 4 * * * * 0
在我给出的测试源码里需要输入一下内容,直接粘贴就可以
7
11
a
b
c
d
e
f
g
a b 15
a c 2
a d 10
b e 6
c e 7
c f 4
f d 5
d g 4
e g 9
f g 10
g b 4
源码地址:
点击这里
版权声明:本文为a1552100455原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。