返回

图解 Dijkstra(迪杰斯特拉)算法 + 代码实现

后端

Dijkstra (迪杰斯特拉)算法

1. 算法原理

Dijkstra算法是一种单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。算法的核心思想是以起始节点为中心,不断扩展到相邻节点,更新最短路径的距离,直到找到所有节点的最短路径。算法的具体步骤如下:

  • 将起始节点标记为已访问,并将其最短路径距离设为0。
  • 寻找起始节点的所有相邻节点,并将它们加入到候选节点集中。
  • 从候选节点集中选择一个最短路径距离最小的节点,标记为已访问,并更新其相邻节点的最短路径距离。
  • 重复步骤3,直到所有节点都已访问过。

2. 算法实现

以下是用Python实现的Dijkstra算法:

def dijkstra(graph, start):
    # 初始化距离和已访问节点集合
    distances = {node: float('infinity') for node in graph}
    distances[start] = 0
    visited = set()

    # 主循环,直到所有节点都已访问过
    while visited != graph:
        # 查找未访问节点中距离最小的一个
        min_node = min(graph - visited, key=lambda node: distances[node])

        # 标记该节点为已访问
        visited.add(min_node)

        # 更新相邻节点的距离
        for neighbor in graph[min_node]:
            new_distance = distances[min_node] + graph[min_node][neighbor]
            if new_distance < distances[neighbor]:
                distances[neighbor] = new_distance

    return distances

# 示例图
graph = {
    'A': {'B': 1, 'C': 4},
    'B': {'C': 2, 'D': 5},
    'C': {'D': 1, 'E': 3},
    'D': {'E': 2},
    'E': {'A': 6}
}

# 运行算法
distances = dijkstra(graph, 'A')

# 打印结果
for node, distance in distances.items():
    print(f"最短路径:{node} - {distance}")

3. 代码示例

以下是使用Dijkstra算法计算从节点A到节点E的最短路径的示例:

# 示例图
graph = {
    'A': {'B': 1, 'C': 4},
    'B': {'C': 2, 'D': 5},
    'C': {'D': 1, 'E': 3},
    'D': {'E': 2},
    'E': {'A': 6}
}

# 运行算法
distances = dijkstra(graph, 'A')

# 打印最短路径
print(f"从节点A到节点E的最短路径为:{distances['E']}")

4. 算法应用

Dijkstra算法广泛应用于各种场景,包括:

  • 路线规划:计算从一个城市到另一个城市的最快或最短路线。
  • 网络路由:计算数据包在网络中从一个节点到另一个节点的最短路径。
  • 电路设计:计算电路中电流流经不同路径的阻力最小的路径。
  • 图形处理:计算图像中两个点之间的最短路径,用于图像分割和对象识别等任务。

5. 算法局限性

Dijkstra算法只适用于权值非负的图。如果图中存在权值为负的边,则算法可能无法找到最短路径,甚至可能陷入无限循环。对于权值可以为负的图,可以使用Bellman-Ford算法或Floyd-Warshall算法来计算最短路径。