最小生成树的prim算法代码

本文介绍了一种基于Prim算法的最小生成树构建方法,并通过具体的C++代码实现了该算法。通过对图的邻接矩阵进行操作,算法能够有效地找出图中的最小生成树。文章还提供了完整的代码示例和数据文件说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据课本的prim算法改的,加了一个创建图的函数和minimum函数。代码如下:

 

在此严重感谢论坛上的一些同学给本代码的修改。

 

prim.txt中的输入信息为:

6 10
A
B
C
D
E
F
A B 6
A C 1
A D 5
B C 5
B E 3
C D 5
C F 4
C E 6
D F 2
E F 6

下面是使用 Java 实现 Prim 算法的示例代码: ```java import java.util.Arrays; public class PrimMST { private static final int V = 5; // 图中顶点的数量 // 查找最小权值的顶点 private int minKey(int[] key, boolean[] mstSet) { int min = Integer.MAX_VALUE; int minIndex = -1; for (int i = 0; i < V; i++) { if (!mstSet[i] && key[i] < min) { min = key[i]; minIndex = i; } } return minIndex; } // 打印生成的 MST private void printMST(int[] parent, int[][] graph) { System.out.println("Edge \tWeight"); for (int i = 1; i < V; i++) { System.out.println(parent[i] + " - " + i + "\t" + graph[i][parent[i]]); } } // 使用 Prim 算法查找 MST private void primMST(int[][] graph) { int[] parent = new int[V]; // 存储 MST int[] key = new int[V]; // 存储每个顶点的键值 boolean[] mstSet = new boolean[V]; // 判断顶点是否已经在 MST 中 // 初始化 key 为最大值,mstSet 为 false Arrays.fill(key, Integer.MAX_VALUE); Arrays.fill(mstSet, false); // 将第一个顶点加入 MST key[0] = 0; parent[0] = -1; // 一共需要添加 V-1 个顶点到 MST 中 for (int i = 0; i < V - 1; i++) { // 选择最小键值的顶点 int u = minKey(key, mstSet); // 将该顶点加入 MST mstSet[u] = true; // 更新相邻顶点的键值 for (int v = 0; v < V; v++) { if (graph[u][v] != 0 && !mstSet[v] && graph[u][v] < key[v]) { parent[v] = u; key[v] = graph[u][v]; } } } // 打印生成的 MST printMST(parent, graph); } public static void main(String[] args) { PrimMST prim = new PrimMST(); int[][] graph = new int[][]{{0, 2, 0, 6, 0}, {2, 0, 3, 8, 5}, {0, 3, 0, 0, 7}, {6, 8, 0, 0, 9}, {0, 5, 7, 9, 0}}; prim.primMST(graph); } } ``` 该代码使用邻接矩阵表示图,示例图的邻接矩阵为: ``` 2 3 6 +--+---+--+---+--+ | 0| 2 | 0| 6 | 0| +--+---+--+---+--+ | 2| 0 | 3| 8 | 5| +--+---+--+---+--+ | 0| 3 | 0| 0 | 7| +--+---+--+---+--+ | 6| 8 | 0| 0 | 9| +--+---+--+---+--+ | 0| 5 | 7| 9 | 0| +--+---+--+---+--+ ``` 输出结果为: ``` Edge Weight 0 - 1 2 1 - 2 3 0 - 3 6 1 - 4 5 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值