流程圖
最小生成樹
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'))
瞎寫的,也不知道對不對,百度也查不到 😥
沒有討論特殊情況(因為暫時想不到特殊情況)
歡迎留言討論 ( •̀ ω •́ )✧