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

相關推薦

[2017年第0屆浙江工業大學之江學院程序設計競賽決賽 I] qwb VS 去汙棒(並查集按秩合並小生成樹LCA)

之間 i++ ont 題意 倍增 題目 while 並查集 工業 題目鏈接:http://115.231.222.240:8081/JudgeOnline/problem.php?cid=1005&pid=8 題意:中文題面。 手動畫一下會發現所求邊必然存在於最大生

關於小生成樹拓撲排序、強連通分量、割點、2-SAT的一點筆記

時間戳 def 條件 問題 復習 lin 由於 保留 染色 關於最小生成樹,拓撲排序、強連通分量、割點、2-SAT的一點筆記 前言:近期在復習這些東西,就xjb寫一點吧。當然以前也寫過,但這次偏重不太一樣 MST 最小瓶頸路:u到v最大權值最小的路徑。在最小生成樹上。是次小

題解——洛谷P1550 [USACO08OCT]打井Watering Hole(小生成樹建圖)

mount scan -o another 決定 clas con pan 通過 題面 題目背景 John的農場缺水了!!! 題目描述 Farmer John has decided to bring water to his N (1 <= N <=

秋季學期一起開心講課-week06-短路徑小生成樹二分圖存圖方式

存圖的兩種方式: 1.鄰接矩陣 #include<iostream> #include<cstirng> using namespace std; #define maxn 1000 int mat[maxn][maxn]; int main() { //初始化

poj1751Highways(小生成樹部分邊已連通)

Highways Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21991  

poj 2349Arctic Network(小生成樹按序加邊一些邊已聯通)

Description The Department of National Defence (DND) wishes to connect several northern outposts by a wireless network. Two different communication

資料結構--C語言--圖的深度優先遍歷廣度優先遍歷拓撲排序用prime演算法實現小生成樹用迪傑斯特拉演算法實現關鍵路徑和關鍵活動的求解短路徑

實驗七  圖的深度優先遍歷(選做,驗證性實驗,4學時) 實驗目的 熟悉圖的陣列表示法和鄰接表儲存結構,掌握構造有向圖、無向圖的演算法 ,在掌握以上知識的基礎上,熟悉圖的深度優先遍歷演算法,並實現。 實驗內容 (1)圖的陣列表示法定義及

一個圖的兩棵小生成樹邊的權值序列排序後結果相同

情形2樹A中並不包含邊bi,則把bi加到樹A上,形成一個圈,由於A是最小生成樹,這個圈裡任意一條邊的權值都不大於w(bi) ,另外,這個圈裡存在邊aj不在樹B中。因此,有w(aj)≤w(bi),且j>i (因為aj不在B中)。於是,有w(bi)≤w(ai)≤w(aj)≤w(bi),因此w(ai)= w(

[轉載]有向圖的小生成樹小樹形圖

轉載: 有固定根的最小樹形圖求法O(VE): 首先消除自環,顯然自環不在最小樹形圖中。然後判定是否存在最小樹形圖,以根為起點DFS一遍即可。 之後進行以下步驟。 設cost為最小樹形圖總權值。 0.置cost=0。 1.求最短弧集合Ao (一條弧就是

小生成樹演算法(python實現)

Kruskal演算法 Kruskal演算法是一種構造最小生成樹的簡單演算法,其中的思想比較簡單。基本思想 設G=(V,E)是一個網路,其中|V|=n。Kruskal演算法構造最小生成樹的過程是: 初始時取包含G中所有n個頂點但沒有任何邊的孤立點子圖T=(V,{}),T裡的

poj1258 Agri-Net 小生成樹kruskal演算法

思路:原始的最小生成樹。第一次寫kruskal演算法,一開始老是RE,還不明白怎麼了,原來連kruskal的過程都忘了。對不起資料結構老師。。。 ///2014.7.7 ///poj1258 /* *最小生成樹,kruskal演算法 */ #include <

ZOJ 1203 Swordfish 劍魚行動 小生成樹Kruskal演算法

Swordfish Time Limit: 2 Seconds      Memory Limit: 65536 KB There exists a world within our world A world beneath what we call cybersp

【圖論-MST】POJ 1251 Jungle Roads 叢林中的道路小生成樹Kruskal演算法

Jungle RoadsTime Limit: 2 Seconds      Memory Limit: 65536 KBThe Head Elder of the tropical island of Lagrishan has a problem. A burst of

【UVa】11354 Bond 小生成樹動態LCA倍增思想

Bond Once again, James Bond is on his way tosaving the world. Bond's latest mission requires him to travel between se

HDU 1301 &POJ 1215 Jungle Roads【小生成樹Prime演算法+Kruskal演算法】

The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago.

小生成樹問題python解法

思路很簡單: 主要是建立兩個集合,一個表示已經遍歷過的節點集合S,另一個表示還沒有遍歷過的節點W,演算法的主要思想借鑑了prim演算法,但是我沒有盡行歸併操作,直接遍歷S和W中的點,尋找最短的邊,從W中刪除,並加入S中,本文參考:https://blog.csdn.net/

小生成樹】【kruscal】【貪心】CDOJ1636 夢後樓臺高鎖酒醒簾幕低垂

ext 停止 min 時間 定義 cal ssi sin 我們 給你一個有n個點和m條邊的無向連通圖,每條邊都有一個權值ww.我們定義,對於一條路徑,它的Charm value為該路徑上所有邊的權值的最大值與最小值的差.詢問從1到n的所有路徑的Charm value的最小值

[Poj2349]Arctic Network(二分小生成樹

接下來 使用 log 小數 NPU mes poj 國防 sam [Poj2349]Arctic Network Description 國防部(DND)要用無線網絡連接北部幾個哨所。兩種不同的通信技術被用於建立網絡:每一個哨所有一個無線電收發器,一些哨所將有一個衛星頻道。

【CF125E】MST Company(凸優化小生成樹

als space false truct main math tdi 給人 kruskal 【CF125E】MST Company(凸優化,最小生成樹) 題面 洛谷 CF 題解 第一眼看見就給人麗潔姐那道\(tree\)一樣的感覺。 那麽二分一個權值,加給所有有一個端點是

大生成樹poj2377 (和小生成樹一個原理只是排序的時候要降序排列)

#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=1000+10; const int maxm=20000+10; struc