《面试》-- 简单使用Python解决图结构的最小路径 -- Dijkstra算法

写在前面

在你观看这篇博客之前,我必须种草、安利一个讲DFS、BFS、Dijkstra的视频,非常建议想学习经典图算法的猴子去看看,时间不长但是很精辟别忘了点赞啊,链接:https://www.bilibili.com/video/av25829980?from=search&seid=12399862396157246554

回归正题

《面试》-- 简单使用Python解决图结构的最小路径 -- Dijkstra算法_第1张图片

图如图所示,假设起点为A,找出起点到剩下各个点的最短路径。

思路:本人肤浅,只知道Dijkstra算法就是专门用来解决这个问题,直接用Dijkstra就可以了。

过程:

《面试》-- 简单使用Python解决图结构的最小路径 -- Dijkstra算法_第2张图片

代码:

import heapq

Graph = {
    'A': {'B': 5, 'C': 1},
    'B': {'A': 5, 'C': 2, 'D': 1},
    'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8},
    'D': {'B': 1, 'C': 4, 'E': 3, 'F': 6},
    'E': {'C': 8, 'D': 3},
    'F': {'D': 6}

}

def Dijkstra(Graph, start):
    assert isinstance(Graph, dict)
    assert isinstance(start, str)
    assert start in Graph.keys()

    # 使用优先队列实现
    pqueue = []
    heapq.heappush(pqueue, (0, start))  # 优先队列入队元素(距离,节点)
    seen = set()
    parent = {start: None}              # 记录每个节点的父节点
    distance = {start: 0}               # 记录开始节点到各个节点的最短距离

    while len(pqueue) > 0:
        pair = heapq.heappop(pqueue)    # 出队元素(距离,节点)
        dist = pair[0]                  # 距离
        vertex = pair[1]                # 节点

        if vertex in seen:
            continue

        seen.add(vertex)                # 只有能出栈才加入集合中
        nodes = Graph[vertex].keys()    # 找出相邻节点

        for w in nodes:
            if w in seen:
                continue

            # 将当前节点的相邻节点加入优先队列中
            heapq.heappush(pqueue, (Graph[vertex][w] + dist, w))
            parent[w] = vertex
            distance[w] = Graph[vertex][w] + dist    

 

你可能感兴趣的:(剑指offer,面试)