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'))

瞎寫的,也不知道對不對,百度也查不到 😥
沒有討論特殊情況(因為暫時想不到特殊情況)
歡迎留言討論 ( •̀ ω •́ )✧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM