6-7 最小生成树(普里姆算法)分数 20 作者 王东 单位 贵州师范学院

试实现普里姆最小生成树算法。

函数接口定义:

void Prim(AMGraph G, char u);

其中 G 是基于邻接矩阵存储表示的无向图,u表示起点

输入样例:

第1行输入结点数vexnum和边数arcnum。第2行输入vexnum个字符表示结点的值,接下来依次输入arcnum行,每行输入3个值,前两个字符表示结点,后一个数表示两个结点之间边的权值。最后一行输入一个字符表示最小生成树的起始结点。

7 9
0123456
0 1 28
0 5 10
1 2 16
1 6 14
2 3 12
3 6 18
3 4 22
4 5 25
4 6 24
0

输出样例:

按最小生成树的生成顺序输出每条边。

0->5
5->4
4->3
3->2
2->1
1->6

ww.png

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

Prim:

#include<iostream>
void Prim(AMGraph G, char u) {
    int middle = LocateVex(G, u);
    closedge[middle].lowcost = 0;
    for (int i = 0; i < G.vexnum; i++) {
        if (i != middle) {
            closedge[i].adjvex = u;
            closedge[i].lowcost = G.arcs[i][middle];
        }
    }
    for (int i = 1; i < G.vexnum; i++) {
        int k = Min(G);
        std::cout << middle << "->" << k;
        if (i != G.vexnum - 1) std::cout << std::endl;
        middle = k;
        closedge[k].lowcost = 0;
        for (int j = 0; j < G.vexnum; j++) {
            if (G.arcs[j][k] && (closedge[j].lowcost > G.arcs[j][k])) {
                closedge[j].adjvex = G.vexs[k];
                closedge[j].lowcost = G.arcs[j][k];
            }
        }
    }
}

提供的引用中未包含PTA 6 - 4最小生成树普里姆算法)的题目内容、解题思路代码实现等相关信息,所以无法直接给出该题目的具体解答。不过,可以介绍普里姆算法的基本原理一般的代码框架。 普里姆算法查找最小生成树的步骤为: 1. 清空生成树,任取一个顶点加入生成树。 2. 在那些一个端点在生成树里,另一个端点不在生成树里的边中,选取一条权最小的边,将它另一个端点加进生成树。 3. 重复步骤2,直到所有的顶点都进入了生成树为止,此时的生成树就是最小生成树 [^4]。 以下是普里姆算法的一般代码框架: ```python # 普里姆算法代码示 import sys def prim(graph): num_vertices = len(graph) # 用于标记顶点是否已在生成树中 visited = [False] * num_vertices # 存储最小生成树的边 mst = [] # 从第一个顶点开始 visited[0] = True while len(mst) < num_vertices - 1: min_weight = sys.maxsize min_edge = None for i in range(num_vertices): if visited[i]: for j in range(num_vertices): if not visited[j] and graph[i][j] > 0 and graph[i][j] < min_weight: min_weight = graph[i][j] min_edge = (i, j) if min_edge: mst.append(min_edge) visited[min_edge[1]] = True return mst # 示图的邻接矩阵 graph = [ [0, 28, 0, 0, 0, 10, 0], [28, 0, 16, 0, 0, 0, 14], [0, 16, 0, 12, 0, 0, 0], [0, 0, 12, 0, 22, 0, 18], [0, 0, 0, 22, 0, 25, 24], [10, 0, 0, 0, 25, 0, 0], [0, 14, 0, 18, 24, 0, 0] ] mst = prim(graph) for edge in mst: print(f"{edge[0]}->{edge[1]}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值