思路很簡單:
主要是建立兩個集合,乙個表示已經遍歷過的節點集合s,另乙個表示還沒有遍歷過的節點w,演算法的主要思想借鑑了prim演算法,但是我沒有盡行歸併操作,直接遍歷s和w中的點,尋找最短的邊,從w中刪除,並加入s中,本文參考:主要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:
# 尋找最短的i節點到j節點的路徑
if min(d_ij)", sets[i_d], "the distance", d_increase
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()
最小生成樹的解法
下標為1 n 返回最小生成樹的權值,返回 1說明無連通 define inf 0x3f3f3f3f int g 1001 1001 int vis 1001 lowc 1001 void init int x,int y,int v int prim int g 1001 int n return ...
最小生成樹問題
1.構造可以使n個城市連線的最小生成樹。問題描述 給定乙個地區的n個城市間的距離網,用prim演算法或kruskal演算法建立最小生成樹,並計算得到的最小生成樹的代價。4 要求 1 城市間的距離網採用鄰接矩陣表示,鄰接矩陣的儲存結構定義採用課本中給出的定義,若兩個城市之間不存在道路,則將相應邊的權值...
最小生成樹問題
最小生成樹 是一棵樹 無迴路 個頂點一定有 條邊 包含全部頂點 條邊都在圖里 邊的權重和最小 生成約束 只能用圖里有的邊 只能正好用掉 條邊 不能有迴路 主要演算法 prim演算法 讓樹長大 int prim int n int ans 0 距離權值總和 vis 1 true 生成樹的根 起點 標記...