演算法題 Prim演算法求最小生成樹(Python)

2021-10-11 02:42:20 字數 1313 閱讀 9709

給定乙個n個點m條邊的無向圖,圖中可能存在重邊和自環,邊權可能為負數。

求最小生成樹的樹邊權重之和,如果最小生成樹不存在則輸出impossible。

給定一張邊帶權的無向圖g=(v, e),其中v表示圖中點的集合,e表示圖中邊的集合,n=|v|,m=|e|。

由v中的全部n個頂點和e中n-1條邊構成的無向連通子圖被稱為g的一棵生成樹,其中邊的權值之和最小的生成樹被稱為無向圖g的最小生成樹。

輸入格式

第一行包含兩個整數n和m。

接下來m行,每行包含三個整數u,v,w,表示點u和點v之間存在一條權值為w的邊。

輸出格式

共一行,若存在最小生成樹,則輸出乙個整數,表示最小生成樹的樹邊權重之和,如果最小生成樹不存在則輸出impossible。

資料範圍

1≤n≤500

1≤m≤10^5

圖中涉及邊的邊權的絕對值均不超過10000。

輸入樣例:

4 5

1 2 1

1 3 2

1 4 3

2 3 2

3 4 4

輸出樣例:

6
n, m = map(int, input().split())

adj = [[float('inf')]*(n+1) for _ in range(n+1)]

dist = [float('inf')]*(n+1)

for _ in range(m):

u, v, w = map(int, input().split())

adj[u][v] = min(adj[u][v], w)

adj[v][u] = adj[u][v]

def prim():

global n

st = [false]*(n+1)

res = 0

for i in range(n):

t = -1

for j in range(1, n+1):

if not st[j] and (t == -1 or dist[t] > dist[j]): t = j

if i and dist[t] == float('inf'): return 'impossible'

st[t] = true

if i: res += dist[t]

for j in range(1, n+1): dist[j] = min(dist[j], adj[t][j])

return res

print(prim())

Prim演算法求最小生成樹

本文參考 google 資料結構 c語言 prim演算法,求最小生成樹 include include 最小生成樹prim define max 65535 using namespace std struct graph int prim graph g flag 0 1 將0號結點加入集合s i...

Prim演算法求最小生成樹

cost i j 存i和j之間的距離,vis i 記錄i點是否被訪問,lowc j 存所有與j點連線的邊的最小的權值。每次找最小的lowc j 然後。最小生成樹 int prim int cost maxn int n 點是0 n 1 if minc inf return 1 原圖不連通 ans m...

Prim演算法求最小生成樹

樸素prim演算法 1 距離初始化成正無窮 2 n次迭代 找到集合外距離最近的點,賦值給t 3 用t更新其他點到集合的距離 跟狄傑斯塔拉不一樣,狄傑斯塔拉是跟原點的距離 點與集合所有點距離最短的點 st t true 給定乙個n個點m條邊的無向圖,圖中可能存在重邊和自環,邊權可能為負數。求最小生成樹...