数据结构 最短路径之—迪杰斯特拉算法

#define MAXVEX 9
#define INFINITY 65535

typedef int PathMatrix[MAXVEX]			//用于存储最短路径下标的数组
typedef int ShortPathTable[MAXVEX]		//用于存储到各点最短路径的权值和  比如V0到V2的权值是4 


void ShortestPath_DIJ(MGraph G, int V0, PathMatrix &P, ShortPathTable &D) //接口:输入的是无向图G,初始点VO,路径矩阵P,以及路径表格,
{

	int final[MAXVEX]; //final[v] = 1 表示已经求得顶点V0到Vw的最短路径。为1的话表明已经取得,为0的话表明还没有取得。


	//初始化数据 初始化数据用的是v0到其他各个结点的长度。
	for(v=0; v<G.numVertexes; v++)
	{
		final[v] = 0;			//全部顶点初始化为未找到的最短路径,所以初始化都为0
		(*D)[v] = G.arc[v0][v];		//将与v0点有联系的顶点加上权值(距离)。  在邻接矩阵中,从V0到V8的最大顶点数开始遍历。
		(*p)[V] = 0;                //初始化路径数组P为0;
	}
	(*D)[V0] = 0;                  //v0到v0的路径为0
	final[V0] = 1;                //V0到V0不需要求路径。

	//开始主循环,每次求得V0到某个V顶点的最短路径 这个循环分为两部分,根prim算法一样,先求出第一部分,然后进行纠正更新。
	for(v=1; v< G.numVertexes; v++) //从1开始的,从第一个顶点开始探讨 接着从下个结点开始。
	{
		min = INFINITY;

		//从D数组中找到最小的值。
		for(w=0; w<G.numVertexes; w++)
		{
			if(!final[w] && (*D)[w]<min) 
			{
				k = w;  //k存储的是距离当前结点距离最近的结点
				min = (*D)[w];
			}	
		}
	
	final[k] = 1;

	//修正当前最短路径以及距离  要求下一层的结点要小于上一个结点到其他结点的距离。
		for (w=0; w<G.numVertexes; w++)
		{
			if(!final[w] && min+G.arc[k][w] < [*D][w]) //当前的min+其他的。
			{
			    (*D)[w] = min + G.arc[k][w]  //修正当前路径长度; 利用前驱顶点和其他顶点的长度且和前面的长度累积比大小。
			    (*p)[w] = k;                 //存放前驱顶点。 前驱结点和这个结点相连接的权值之和为<(*D)[k]. 发现用到p没什么用!
			}
		}
	}

}

详情过程可以参考这个! 

https://wenku.baidu.com/view/6dc5c62486c24028915f804d2b160b4e767f810f

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值