数据结构上机实现——迪杰斯特拉算法

前言

迪杰斯特拉(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

源码地址:点击这里

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值