算法学习 - Dijkstra's Algorithm

1. Dijkstra's Algorithm是解决单源最短路径问题,即:从某个源点到其余各顶点的最短路径;

2. Dijkstra's Algorithm中有两上关键点要注意(这是我学习的时候不仔细,导致走了很多弯路)。这里先明确两个集合:所有顶点集V和已选中顶点集S。

    一、找到当前未选中点(V - S)中距离源点最近的点;

    二、更新未选中点到源点的距离。

3. 建议:结合程序及一个示例来理解这个算法。我在学习时,看别人画的各种表格来描述这个算法,看了半天,感觉是明白了,但常常发现有不明确的地方。在结合程序理解算法之后,则有豁然开朗之感。

    下图来自《Introduction of Algorithm》中的示例,这个示例个人觉得很典型,如下图:

程序如下(来自《数据结构(C语言版)》——严蔚敏):

 

void ShortestPath_Dijkstra(size_t** arcs, size_t v0, bool** P, size_t* D, size_t vexnum)
{
	size_t i = 0;
	size_t v = 0;
	size_t w = 0;
	size_t min = 0;
	//用Dijkstra算法求有向网的v0顶点到其余顶点v的最短路径P[v]及其带权长度D[v]。
	//P[v][w]为true,则w是从v0到v当前求得最短路径上的顶点。
	//final[v]为true,当且仅当v属于S时,即已经求得从v0到v的最短路径。
	bool* final = new bool[vexnum];
	for (v = 0; v < vexnum; v++)
	{
		//初始化
		final[v] = false;
		D[v] = arcs[v0][v];
		for (w = 0; w 


你可能感兴趣的:(算法)