Prim算法-Python实现

流程图

image
image
image
image
image
image
image
image
image

最小生成树

image

Python 实现

Graph = {
    'a': {
        'b': 8,
        'c': 4,
    },
    'b': {
        'a': 8,
        'c': 11,
        'd': 7,
        'f': 1
    },
    'c': {
        'a': 4,
        'b': 11,
        'e': 8
    },
    'd': {
        'b': 7,
        'e': 2
    },
    'e': {
        'c': 8,
        'd': 2,
        'h': 4,
        'g': 7
    },
    'f': {
        'd': 6,
        'b': 7,
        'h': 2
    },
    'g': {
        'e': 7,
        'h': 14,
        'i': 9
    },
    'h': {
        'e': 4,
        'f': 2,
        'g': 14,
        'i': 10
    },
    'i': {
        'g': 9,
        'h': 10
    }
}


def Prim(Graph, Root):
    # 已经访问的节点
    NodeVisited = []
    # 未访问的节点
    NodeNotVisited = list(Graph.keys())
    # 初始化最小生成树
    Tree = {}
    for item in NodeNotVisited:
        Tree[item] = {}

    # 访问根节点
    NodeVisited.append(Root)  # 将根节点标记为已访问
    NodeNotVisited.remove(Root)  # 从未访问列表里删除根节点

    # 当没有未访问的节点时退出循环
    while len(NodeNotVisited):
        ShortDist = 0  # 最小权值(距离)
        TargetNode = ''  # 目标节点
        PrecNode = ''
        # 以已经访问的节点作为起点
        # 获取已经访问过节点的键
        for item in NodeVisited:
            # 遍历访问过的节点的内容
            for (Key, Value) in Graph.get(item).items():
                # 如果不在已经访问过的节点里
                if Key not in NodeVisited:
                    # ShortDist == 0 或者不是最短的时候就修改
                    if ShortDist == 0 or ShortDist >= Value:
                        ShortDist = Value
                        TargetNode = Key
                        PrecNode = item

        # 遍历结束后将最短路径的那个节点加入已经访问节点列表
        NodeVisited.append(TargetNode)
        # 前一个节点和后一个节点互相绑定
        Tree[PrecNode].update({TargetNode: ShortDist})
        Tree[TargetNode].update({PrecNode: ShortDist})
        # 从未访问的节点中删除
        NodeNotVisited.remove(TargetNode)

    return Tree


if __name__ == '__main__':
    print(Prim(Graph, 'a'))

瞎写的,也不知道对不对,百度也查不到 😥
没有讨论特殊情况(因为暂时想不到特殊情况)
欢迎留言讨论 ( •̀ ω •́ )✧

posted @ 2021-10-06 22:10  ICE99125  阅读(480)  评论(0编辑  收藏  举报