给你一些可连接的选项connections,其中每个选项connections[i] = [city1, city2, cost]表示将城市city1和城市city2连接所要的成本(连接是双向的,也就是说城市city1和城市city2相连,也同样意味着城市city2和城市city1相连)。返回使得每对城市间都存在将它们连接在一起的连通路径(可能长度为1的)最小成本。该最小成本应该是所有全部连接代价的总合。如果根据已知条件无法完成该项任务,则请你返回-1。 (请用Prim算法完成相应的代码)
时间: 2024-02-05 11:10:47 浏览: 142
以下是Prim算法的实现:
```python
import heapq
def minimumCost(n: int, connections: List[List[int]]) -> int:
# 将连接按照成本从小到大排序
connections.sort(key=lambda x: x[2])
# visited数组记录每个节点是否被访问过
visited = [False] * (n + 1)
# 从第一个节点开始遍历
start_node = connections[0][0]
visited[start_node] = True
# 初始化堆,将与第一个节点相连的边加入堆中
heap = []
for connection in connections:
if connection[0] == start_node:
heapq.heappush(heap, (connection[2], connection[1]))
elif connection[1] == start_node:
heapq.heappush(heap, (connection[2], connection[0]))
# 记录已有的边数和总成本
count = 1
cost = 0
# 循环直到所有节点都被访问
while heap and count < n:
# 取出堆中最小成本的边
c, node = heapq.heappop(heap)
# 如果该节点已被访问过,则跳过,否则将其标记为已访问
if visited[node]:
continue
visited[node] = True
# 将与该节点相连的边加入堆中
for connection in connections:
if connection[0] == node and not visited[connection[1]]:
heapq.heappush(heap, (connection[2], connection[1]))
elif connection[1] == node and not visited[connection[0]]:
heapq.heappush(heap, (connection[2], connection[0]))
# 记录已有的边数和总成本
count += 1
cost += c
# 如果所有节点都被访问,则返回总成本,否则返回-1
return cost if count == n else -1
```
算法思路:
1. 将连接按照成本从小到大排序,以便后续遍历时优先选择成本小的边。
2. 从第一个节点开始遍历,将其标记为已访问,并将与该节点相连的边加入堆中。
3. 循环直到所有节点都被访问,每次取出堆中最小成本的边,如果该边连接的节点已被访问过,则跳过,否则将该节点标记为已访问,并将与该节点相连的边加入堆中。同时记录已有的边数和总成本。
4. 如果所有节点都被访问,则返回总成本,否则返回-1。
阅读全文