单源点的最短路径

求带权有向图的最短路径,最常用的是迪杰斯特拉算法。算法的描述为:首先确定一个源点即起始点,从起始点到其他顶点的最短距离。采取的过程是用一个数组保存当前求得的最短路径,初始化时只有源点。然后遍历从起始点开始的边的权值找一个最小的,然后将这个顶点加入到数组中,重复这个过程,直到所有的顶点都在数组中为止。个人描述的可能不太清楚,其实感觉和prime算法很想,就是从一个点出发选择权值最小的并且可以引入一个新的节点,然后把这个节点当做源点重复上一步的操作,直到全部的顶点都已加入。
void shortestPath(){

	int visited[];//用于记录该顶点是否已经在最短路径中
	int arc[][];//邻接矩阵
	int vex[];//顶点集合
	int path[];//保存最短路径顶点
	int D[];//v0到v的路径权值

	for(v=0;v<vex.length;v++){
		visited[v] = 0;
		D[v] = arc[v0][v];
		path[v] = 0;
	}//初始化

	D[v0] = 0;
	visited[v0] = 0;

	for(v=1;v<vex.length;v++){
		int min;//当前已知的最短距离
		for(w=0;w<vex.length;w++){
			if(!visited[w] && D[w]<min){
				k = w;
				min = D[w];
			}//if
		}//for
		visited[k] = 1;//标记为已加入路径

	for(w=0;w<vex.length;w++){
		if(visited[w] && (min+arc[k][w]<D[w])){
			D[w] = min + arc[k][w];
			path[w] = k;
		}
	}
	}//for
}
可能由于自己理解的也不是太深入,希望大家能看懂。也许指出其中的问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值