Dijkstra算法是一种解决单源最短路径问题的贪心算法。它的主要思想是从起点出发,逐步确定从起点到各顶点的最短路径,并标记已经确定最短路径的顶点。通过不断更新顶点的最短路径和路径长度,最终得到起点到其他所有顶点的最短路径。
以下是Dijkstra算法的流程和步骤:
【1】 初始化:创建一个距离数组dist[]和一个标记数组visited[],并将起点到起点的距离设为0,其他顶点到起点的距离设为无穷大(表示尚未确定最短路径),将visited[]数组初始化为false。
【2】选择当前距离起点最近的顶点作为当前顶点,标记为已访问。
【3】 遍历当前顶点的邻接顶点,计算从起点经过当前顶点到邻接顶点的距离。若该距离小于邻接顶点的当前最短路径,则更新邻接顶点的最短路径和路径长度。
【4】 从未标记的顶点中选择距离起点最近的顶点作为下一个当前顶点,重复步骤3,直到所有顶点都被访问。
【5】 最终得到起点到各顶点的最短路径和路径长度。
示例:使用下图来演示如何求Dijkstra最短距离
下面我们通过一个通俗易懂的图示来演示Dijkstra算法的过程。我们创建一个距离数组dist[]和一个标记数组visited[],其中dist[]红色代表选中该节点;visited[]绿色代表访问过。
初始化:创建一个距离数组dist[]和一个标记数组visited[],并将起点到起点的距离设为0,其他顶点到起点的距离设为无穷大(表示尚未确定最短路径),将visited[]数组初始化为false(标记绿色为true)。
步骤-1:
【1】对于节点1,其距离为0,将0填入dist[]对应节点的位置;对应的节点已经被访问过,将visited[]对应节点的位置标记为绿色;
【2】当前顶点的邻接顶点2、3,距离分别为2、15。更新邻接顶点的最短路径和路径长度,在这里将原来的无穷大更新为现有的值即可;
【3】从未标记的顶点中选择距离起点最近的顶点作为下一个当前顶点,在数组dist[]中,被访问的节点除外,节点2的值2最小,选择下一个节点2。
步骤-2:
【1】对于节点2,其距离为2,将2填入dist[]对应节点的位置;对应的节点已经被访问过,将visited[]对应节点的位置标记为绿色;
【2当前顶点的邻接顶点3、4,其距离分别为10(2+8)、7(2+5)。则更新邻接顶点的最短路径和路径长度,在这里节点3原来为15更新为10,节点4由无穷大更新为7,下同;
【3】 从未标记的顶点中选择距离起点最近的顶点作为下一个当前顶点,在数组dist[]中,被访问的节点除外,节点4的值7最小,选择节点4。
步骤-3:
【1】对于节点4,其距离为7,将7填入dist[]对应节点的位置;对应的节点已经被访问过,将visited[]对应节点的位置标记为绿色;
【2当前顶点的邻接顶点5、6,其距离分别为23、35。
【3】 从未标记的顶点中选择距离起点最近的顶点作为下一个当前顶点,在数组dist[]中,被访问的节点除外,节点3的值10最小,选择节点3。
步骤-4:
<