給定乙個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條邊的無向圖,圖中可能存在重邊和自環,邊權可能為負數。求最小生成樹...