ACM算法:迪杰斯特拉最短路径

迪杰斯特拉的用途:迪杰斯特拉算法用于求出图中一个结点到其他所有结点的最短路径。迪杰斯

特拉算法是求最短路径中较为常用的算法,而且方便使用易于理解,很适合用来当成最短路径入

门的模板实例算法。无论是在有向图还是无向图,都有它的优势之处。


迪杰斯特拉的思路:迪杰斯特拉算法的思路非常的清晰,我结合图解来解释(图是网上找的,如

有雷同,纯属巧合)

ACM算法:迪杰斯特拉最短路径_第1张图片先解释各个字母所代表的意思:S代表已经找到了最短路径的点,u代表目前的点到所连接的最短路径的点,dist储存目前起始点到该点的最短路径。

(起始点为“1”)


逻辑主线:

第一步:将与起始点直接连接的点的距离储存在dist数组中,找出到其中最短路径的点。如图中的点“2”,则10就是点“1”到点“2”的最短路径,因为从“1”经过其他点间接连接点“2”的点一定会比10 大(仔细想想就知道了)。


第二步:将(点“2”直接连接的点的距离 + 10)储存在dist数组中,如果原先数组中该点所在的位置已经有值,则比较,新值更小则替换。其中dist数组中值最小的点就是起始点到该点的最短距离,如图中sist[4]。


之后重复第二步的操作,直到将结点全部遍历。


注:每找出一个最短距离就将该点标记为一遍历,也就说需要(结点书-1)次循环



附上代码说明:

/*迪杰斯特拉算法求某个顶点到其余顶点的最短路径*/
/*代码示例使用邻接矩阵来展示*/
void DIJ(MGraph &G, int v)
{
	int i, j, k, min;
	int final1[MAX_VERTEX_NUM];//该数组用来标识顶点是否已确定了最短路径  
	int dist[MAX_VERTEX_NUM];
	string path[2 * MAX_VERTEX_NUM];
	for (i = 0; idist[k] + G.edges[k][i] && final1[i] == 0)
			{
				dist[i] = dist[k] + G.edges[k][i];
				path[i] = path[k] + G.vexs[i];
			}
		}//从整体上来看就是算出k的邻接点的当前最短路径  
	}
}


总结:迪杰斯特拉算法的便利性以及其思路的清晰性得到了很高的认可,属于数据结构中常用、

也是ACM求最短路径的入门首选,需要我们去掌握。


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