3---------最短路径--迪杰斯特拉算法

迪杰斯特拉算法常用来求某个顶点到所有顶点的最短路径
当然能够获取到到所有顶点的最短路径,那么也能够获取到它到某一顶点的最短路径了


这里写图片描述

例如上面这个图,从1顶点出发,用迪杰斯特拉算法求到每个顶点的最短路径如何求呢?,下面,模拟迪杰斯特拉算法实现求最短路径
构造三个数组
int disk[]; [0,1,3,n,n,n,n] //先初始化1到每个顶点的最小值,n表示无穷
int path[]; [1,0,0,0,0,0,0]//记录这个顶点的前驱结点,用来构造最短路径
int final[]; [1,0,0,0,0,0,0]//用来记录这个结点是否已经求得最短路径
首先,我们从1顶点出发,依次向周围探测,探测到最短的路径,就加入到最短的路径中,例如,1到2明显较短,那么path[1,1,1],final[1,1,1]
然后我们通过循环遍历找点比较短的路径,是1-2然后从2结点开始依次向周围探测,发现2-4的距离比1-4 的距离要短,那么修改为disk[0,1,3,7],path[1,1,1,2],同理2-6结点也是比1-6短,那么就将6结点加入到disk中
完成上序步骤之后开始第二次循环,
这时,我们再剩余的没有构造最短路径的结点中找打最短的那条继续往外延伸到其他结点的最短路径,那么就找到了3号结点,然后按照刚刚的步骤依次往外层搜索,直到将所有的点都完成最短路径的构造


/**
*	最短路径算法,迪杰斯特拉算法,能求出某个点到所有点的最短路径和,从某个顶点依次往外探索,然后修改值
*	最后获得的disk数组表示没个点的最短路径,path数组表示每个点到v0点的最短路径
*	@param v0表示求该顶点到每个顶点的最短路径
*	@param disk该顶点到每个顶点的权值路径和
*	@param path表示该顶点到每个顶点的最短路径,数组的值指向前驱结点
*/
void disktra(MGraph * G,int v0,int disk[],int path[]){
	int final[maxSize];//记录该顶点是否已经求得最短路径
	int i,j,v;
	int min;	//用来记录最小值
	for(i=0;i<G->n;i++){	//初始化各数组
		final[i] = 0;
		if(G->edged[v0][i] < INF) path[i] = v0; else path[i] = -1;
		disk[i] = G->edged[v0][i];
	}
	final[v0] = 1; 	//自身到自身的最短路径不需要求了
	path[v0] = 0;	//自身的前驱结点是0
	for(i=1;i<G->n;i++){
		min = INF;
		for(j=0;j<G->n;j++){
			if(!final[j]&&disk[j]<min){	//如果该点还没有被构成最短路径,并且是v点到剩余的点中最短的一条
				min = disk[j];
				v = j;	//记录该点
			}
		}
		final[v] = 1;	//下面开始对该点构造最短路径并且依次探索该点到其他点最短边
		for(j=0;j<G->n;j++){
			//如果该点没有被探测过并且该路径比上次探测得到该点路径还要端的话,就修正
			if(!final[j]&&(min+G->edges[v][j])<disk[j]){	
				disk[j] = min+G->edges[v][j];	//修正上次探测到到该点的路径
				path[j] = v;	//修真该点的前驱结点
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值