Dijkstra算法是用来解决单元最短路径的一种算法。在一个加权的图中,给定一个源点,可以使用Dijkstra算法求这个顶点到其它各个顶点的最短路径。
Dijkstra算法是一个典型的贪心算法,每一步确定一个顶点到源点的最短路径。算法开始的时候,我们可以假定所有的顶点到源的距离d均未知(可以设置这些顶点到源点的距离为一个指定的最大值),我们可以将这些顶点组成的集合成为未知顶点集;显然,源点距离源点自身的距离可以认为是0。之后我们使用一个循环,每次循环,我们查看当前位置顶点集中,到源点具有最小距离的顶点,这个距离,为源点到该点所有可达的路径中,具有最小距离的路径,这样我们就确定了该顶点到源的距离;之后我们将该顶点从未知顶点集中删除,加入到已知顶点集中(实际上代码中并不需要将该顶点添加到已知顶点集,此处只是为了叙述方便)同时更新该顶点的邻接表中的顶点的距离,如果通过该顶点到达邻接表中的结点,具有更短的距离,则将邻接表中的顶点的距离更新为新的值。最终,未知顶点集为空(这个终止条件只适用于连通图,并且源到所有结点均可达),循环结束。
Distra算法每次的结点选择使用的是贪心策略,每次选取的的顶点,是当前未知顶点集中到源点距离最小的顶点。由于这个距离是当前源通过所有已知顶点集中的能够到达的所有未知顶点集中最小的值,不可能寻找到一个更短的路径使这个距离的值变小,所以可以确定这个顶点到源点的最短距离(但是其他未知顶点的距离,是有机会通过该顶点变得更小的)。
图的表示通常可以采用邻接矩阵和邻接表法,对于顶点之间连接比较稀疏的图,通常邻接矩阵会浪费更多的存储空间,因此本例中使用邻接表来存储图中顶点之间的连线。
一个可能的表示顶点的结构体:
struct vertex
{
unsigned int distance; //顶点到源点的距离
vertex*