题目内容:某地对偏远地区实行“村村通”工程,目标是使整个地区任何两个村落间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到拟修建道路的费用,现请你编写程序,计算出全地区畅通需要的最低成本。输入格式:输入的第一行给出村庄数目N (1≤N≤20)和拟修建的道路数M接下来的M行对应修建每条村庄间道路的成本,每行给出3个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本。输出格式:输出需修建的道路,按prim算法从编号1开始得到的顺序,输出每条路,每行输出一条道路,形式如:道路1编号,道路2编号,费用。(编号小的放前面,编号大的放后面,逗号为英文状态下的逗号)输入样例:4 61 2 11 3 41 4 12 3 32 4 23 4 5输出样例:1,2,11,4,1
时间: 2024-02-29 19:52:19 浏览: 118
这是一个经典的最小生成树问题,可以使用 Prim 或者 Kruskal 算法解决。下面是使用 Prim 算法的 Python 代码实现:
```python
import sys
# 读入输入数据
N, M = map(int, input().split())
cost = [[sys.maxsize] * (N + 1) for _ in range(N + 1)]
for i in range(M):
a, b, c = map(int, input().split())
cost[a][b] = cost[b][a] = c
# Prim 算法求解最小生成树
INF = sys.maxsize
visited = [False] * (N + 1)
dist = [INF] * (N + 1)
dist[1] = 0
while True:
v = -1
for i in range(1, N + 1):
if not visited[i] and (v == -1 or dist[i] < dist[v]):
v = i
if v == -1:
break
visited[v] = True
for i in range(1, N + 1):
if not visited[i] and cost[v][i] < dist[i]:
dist[i] = cost[v][i]
# 输出最小生成树的边
ans = []
for i in range(2, N + 1):
ans.append((i, parent[i], cost[i][parent[i]]))
ans.sort()
for a, b, c in ans:
print("{},{},{}".format(min(a, b), max(a, b), c))
```
其中,`cost` 表示村庄之间修建道路的成本,`INF` 表示无穷大,`visited` 表示当前村庄是否已经访问过,`dist` 表示从村庄 1 到各个村庄的最短距离,`parent` 表示当前村庄在最小生成树中的父节点。代码中的核心部分是 Prim 算法求解最小生成树,最后遍历最小生成树的边并输出即可。
阅读全文