算法作业,实际没有考虑图不连通的情况 ,以后再加
# 选出最小字母
def sort(V):
min = 0
for i in range(1, len(V)):
if ord(V[i]) < ord(V[min]):
min = i
return V[min]
def PRIM(G, T, U, V, dist, min):
# 从最小的点开始
U.append(min)
V.remove(min)
dist[min] = 0
for v1, v2, w in G:
if v1 == min:
temp = v2 # 相邻边
elif v2 == min:
temp = v1
else:
continue
dist[temp] = w
prim(G, T, U, V, dist)
def prim(G, T, U, V, dist):
if not V:
return
# 需要更新的点集
upgrade_dist = []
change = False
min = V[0]
for i in range(len(V)):
if dist[V[i]] < dist[min]:
min = V[i]
elif dist[V[i]] == dist[min]:
if ord(V[i]) < ord(min):
min = V[i]
else:
continue
for v1, v2, w in G:
if v1 == min:
temp = v2 # 相邻边
elif v2 == min:
temp = v1
else:
continue
# 更新距离
if temp not in U and (dist[temp] > w):
dist[temp] = w
upgrade_dist.append(temp)
elif temp in U and change == False:
if (min, temp, dist[min]) in G:
T.append((min, temp, dist[min]))
V.remove(min)
U.append(min)
change = True
elif (temp, min, dist[min]) in G:
T.append((temp, min, dist[min]))
V.remove(min)
U.append(min)
change = True
prim(G, T, U, V, dist)
if __name__ == "__main__":
m, n = map(int, input("请输入点和边的个数,以逗号分隔:").split(","))
print(m, n)
print("按序输入:相邻两点,边的权重,以逗号分隔:")
# 图的信息、生成树、生成树点集、未进入生成树的点集
G, T, U, V = [], [], [], []
for i in range(n):
V_1, V_2, E = input("").split(",")
G.append((V_1, V_2, int(E)))
V.append(V_1)
V.append(V_2)
# 去重
V = list(set(V))
# 距离,字典存储,后续更新
dist = dict.fromkeys(V, float('inf'))
PRIM(G, T, U, V, dist, sort(V))
print("最小生成树为:")
for v1, v2, w in T:
print(v1, v2, w, )