📜  DAA-最短路径(1)

📅  最后修改于: 2023-12-03 15:14:35.521000             🧑  作者: Mango

DAA-最短路径

在计算机科学中,最短路径算法是用于在加权图中查找两个节点之间的最短路径的算法。这个问题在许多实际情况中都是非常有用的,比如在地理信息系统中查找两个城市之间的最短路径。DAA是一种可以用来解决最短路径问题的算法。

算法描述

DAA(Dijkstra’s Algorithm)算法是一种用于在加权图中找到单源最短路径的算法。在该算法中,我们从起点开始,维护一个小根堆,该堆用于存储当前已知的从起点到每个节点的最短路径,并选择一个距离起点最近的节点进行探索。

具体算法如下:

  1. 初始化两个集合:visited和unvisited。

  2. 用正无穷大初始化每个节点的距离。

  3. 将起始节点的距离设置为0,并将其添加到visited中。

  4. 遍历起始节点的所有邻居节点,计算从起始节点到邻居节点的距离,并将其存储到该节点的距离属性中。

  5. 将所有邻居节点添加到unvisited集合中。

  6. 遍历unvisited集合中的所有节点,选择距离起点最近的节点。

  7. 遍历该节点的所有邻居,计算从起点到该邻居的距离。如果该距离小于该邻居的距离属性,则更新该距离属性。

  8. 将该邻居节点添加到visited集合中,并从unvisited集合中移除。

  9. 重复步骤6-8,直到所有节点都被访问过或没有可达的节点。

  10. 返回每个节点的距离属性作为最短路径。

算法复杂度

DAA算法的时间复杂度为O(E+V log V),其中E是边的数量,V是节点的数量。

代码实现

以下是使用Python语言实现DAA算法的代码:

import heapq

def dijkstra(graph, start):
    distances = {node: float('inf') for node in graph}
    distances[start] = 0

    heap = [(0, start)]

    while heap:
        (current_distance, current_node) = heapq.heappop(heap)

        if current_distance > distances[current_node]:
            continue

        for neighbor, cost in graph[current_node].items():
            distance = current_distance + cost

            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(heap, (distance, neighbor))

    return distances
    
# Example usage
graph = {
    'A': {'B': 1, 'C': 4},
    'B': {'A': 1, 'D': 7},
    'C': {'A': 4, 'D': 2},
    'D': {'B': 7, 'C': 2}
}

print(dijkstra(graph, 'A'))

以上代码实现了一个DAA算法的示例,输入一个包含边权重信息的图和起始节点,输出从起始节点到每个节点的最短路径。