最小生成樹問題,python解法
阿新 • • 發佈:2019-01-20
思路很簡單:
主要是建立兩個集合,一個表示已經遍歷過的節點集合S,另一個表示還沒有遍歷過的節點W,演算法的主要思想借鑑了prim演算法,但是我沒有盡行歸併操作,直接遍歷S和W中的點,尋找最短的邊,從W中刪除,並加入S中,本文參考:https://blog.csdn.net/qq_35644234/article/details/59106779,主要Python演算法程式碼如下:
# 最小生成樹,動態規劃解法 class Solution: def __init__(self,X,start_node): self.X = X self.start_node = start_node def prim(self): num = len(self.X) first_node = self.start_node last_node = self.start_node sets = range(num) sets.pop(first_node) first_set = [self.start_node] self.dtgh(first_set,sets) return first_set def dtgh(self,past_sets,sets): if len(sets) == 0: return d_i = [] d_min = 10000 # 遍歷還未經過的節點 for i in range(len(sets)): d_ij = [] # 儲存已經過集合中所有節點(j)到新集合中i節點的距離 for j in past_sets: d_ij.append(self.X[j][sets[i]]) # 尋找最短的i節點到j節點的路徑 if min(d_ij)<d_min: # 最短路徑中的(位於老集合中的節點)j節點 j_min = d_ij.index(min(d_ij)) # 最短路徑中的(位於新集合中的節點)i節點 i_d = i d_i.append(min(d_ij)) #求取所有i(新集合)節點與老集合的最小距離集合 d_min = min(d_ij) #參與迴圈 d_increase = min(d_i) # 當前最短路徑(j,i)的最短距離 print past_sets[j_min], "---->", sets[i_d], "the distance", d_increase past_sets.append(sets[i_d]) sets.pop(i_d) self.dtgh(past_sets,sets) D = [[0,6,1,5,999,999],[6,0,5,999,3,999],[1,5,0,5,6,4],[5,999,5,0,999,2],[999,3,6,999,0,6],[999,999,4,2,6,0]] start_node = 0 S = Solution(D,start_node) S.prim()