1. 程式人生 > >最小生成樹問題,python解法

最小生成樹問題,python解法

思路很簡單:

主要是建立兩個集合,一個表示已經遍歷過的節點集合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()

相關推薦

no