Prim算法 Python實(shí)現(xiàn)代碼

本文只對(duì)Prim算法進(jìn)行實(shí)現(xiàn),若需了解算法原理可參考文末鏈接。

import numpy as np
import random


# 隨機(jī)生成有權(quán)矩陣
def generate_map(ver_num=6):
    graph = []
    for i in range(ver_num):
        raw = []
        for j in range(ver_num):
            if i == j:
                raw.append(np.inf)
            else:
                raw.append(random.randint(1, 31))
        graph.append(raw)
    print(graph)
    return graph


# 求已經(jīng)確定的頂點(diǎn)集合與未選頂點(diǎn)集合中的最小邊
def min_edge(select, candidate, graph):
    # 記錄最小邊權(quán)重
    min_weight = np.inf
    # 記錄最小邊
    v, u = 0, 0
    # 循環(huán)掃描已選頂點(diǎn)與未選頂點(diǎn),尋找最小邊
    for i in select:
        for j in candidate:
            # 如果存在比當(dāng)前的最小邊權(quán)重還小的邊,則記錄
            if min_weight > graph[i][j]:
                min_weight = graph[i][j]
                v, u = i, j
    # 返回記錄的最小邊的兩個(gè)頂點(diǎn)
    return v, u


# prim算法
def prim(graph):
    # 頂點(diǎn)個(gè)數(shù)
    vertex_num = len(graph)
    # 存儲(chǔ)已選頂點(diǎn),初始化時(shí)可隨機(jī)選擇一個(gè)起點(diǎn)
    select = [0]
    # 存儲(chǔ)未選頂點(diǎn)
    candidate = list(range(1, vertex_num))
    # 存儲(chǔ)每次搜索到的最小生成樹(shù)的邊
    edge = []
    # 由于連接n個(gè)頂點(diǎn)需要n-1條邊,故進(jìn)行n-1次循環(huán),以找到足夠的邊
    for i in range(1, vertex_num):
        # 調(diào)用函數(shù)尋找當(dāng)前最小邊
        v, u = min_edge(select, candidate, graph)
        # 添加到最小生成樹(shù)邊的集合中
        edge.append((v, u))
        # v是select中的頂點(diǎn),u為candidate中的頂點(diǎn),故將u加入candidate,以代表已經(jīng)選擇該頂點(diǎn)
        select.append(u)
        # 同時(shí)將u從candidate中刪除
        candidate.remove(u)
    print(edge)
    return edge


def main():
    # graph = generate_map()
    graph = [[np.inf, 3, np.inf, np.inf, 6, 5],
                  [3, np.inf, 1, np.inf, np.inf, 4],
                  [np.inf, 1, np.inf, 6, np.inf, 4],
                  [np.inf, np.inf, 6, np.inf, 8, 5],
                  [6, np.inf, np.inf, 8, np.inf, 2],
                  [5, 4, 4, 5, 2, np.inf]]
    prim(graph)

Prim算法原理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 首頁(yè) 資訊 文章 資源 小組 相親 登錄 注冊(cè) 首頁(yè) 最新文章 IT 職場(chǎng) 前端 后端 移動(dòng)端 數(shù)據(jù)庫(kù) 運(yùn)維 其他...
    Helen_Cat閱讀 4,153評(píng)論 1 10
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,673評(píng)論 1 32
  • 早上好!靜暖人生:每日一句正能量 (2018年3月9日 農(nóng)歷正月二十二 星期五) 人總是這樣; 想念一個(gè)人的時(shí)候,...
    俠姐27687閱讀 241評(píng)論 0 2
  • 親情,是世界上最柔軟、最無(wú)私、最感人肺腑的心靈雞湯。當(dāng)我們面臨人生低谷時(shí),親情能拯救我們于無(wú)助中;當(dāng)我們擁...
    時(shí)光從此安好閱讀 546評(píng)論 0 3
  • 每個(gè)人都在當(dāng)下最難的時(shí)候盡了全力,每個(gè)人都是想更好的,每個(gè)負(fù)向的背后一定有正向的一面,不要強(qiáng)迫當(dāng)事人的思維,我們...
    漫步奮斗路閱讀 225評(píng)論 0 1

友情鏈接更多精彩內(nèi)容