北航主要办公科研楼有新主楼、逸夫楼、如心楼、办公楼、图书馆、主楼、一号楼等等;。北航网络中心计划要给相关建筑物间铺设光缆进行网络连通,请给出用料最少的铺设方案。 编写程序输入一个办公区域分布图及建筑物之间的距离,计算出用料最少的铺设方案(只有一组最优解,不用考虑多组解)。要求采用Prim或Kruskal算法实现。 【输入形式】 办公区域分布图的顶点(即建筑物)按照自然数(0,1,2,n-1)进行编号,从标准输入中首先输入两个正整数,分别表示线路图的顶点的数目和边的数目,然后在接下的行中输入每条边的信息,每条边占一行,具体形式如下: <n> <e> <id> <vi> <vj> <weight> ... 即顶点vi和vj之间边的权重是weight,边的编号是id。
时间: 2023-11-22 07:56:43 浏览: 152
以下是用Prim算法实现的最小生成树代码,其中采用了邻接矩阵存储边的信息:
```python
INF = float('inf')
n, e = map(int, input().split()) # n为顶点数,e为边数
graph = [[INF] * n for _ in range(n)] # 邻接矩阵存储边的信息
for i in range(e):
id, vi, vj, weight = map(int, input().split())
graph[vi][vj] = graph[vj][vi] = weight # 无向图,需要将vi和vj之间的边权重相同
# Prim算法
visited = [False] * n
min_dist = [INF] * n
min_dist[0] = 0 # 从任意一个顶点开始都可以,这里从0开始
for _ in range(n):
# 找到未访问过的距离最小的顶点
min_v = -1
for i in range(n):
if not visited[i] and (min_v == -1 or min_dist[i] < min_dist[min_v]):
min_v = i
visited[min_v] = True
# 更新与min_v相邻的顶点的距离
for j in range(n):
if not visited[j] and graph[min_v][j] < min_dist[j]:
min_dist[j] = graph[min_v][j]
# 计算最小生成树的权值和
total_weight = sum(min_dist)
print(total_weight)
```
代码思路如下:
首先输入顶点数和边数,然后创建邻接矩阵存储边的信息。接下来依次输入每条边的信息,并将无向图中两个顶点之间的边权重相同。
然后使用Prim算法计算最小生成树的权值和。首先将所有顶点标记为未访问过,将从任意一个顶点开始,这里选择了编号为0的顶点。然后循环n次,每次找到未访问过的距离最小的顶点min_v,并将其标记为已访问。接着更新与min_v相邻的顶点的距离,如果距离更小则更新min_dist数组。最后计算最小生成树的权值和,即min_dist数组中所有元素的和。
注意:以上代码只给出了Prim算法的实现,如需使用Kruskal算法,需要另外实现并查集等数据结构。
阅读全文