java实现:设G=VE是连通带权图如下图所示。使用Prim算法建立G的最小生成树。
以下是Java代码实现Prim算法建立最小生成树:
import java.util.*;
public class PrimAlgorithm {
private static final int INF = Integer.MAX_VALUE; // 无穷大
public static void main(String[] args) {
int[][] graph = { // 图的邻接矩阵
{0, 2, 4, INF, INF, INF},
{2, 0, 6, 3, INF, INF},
{4, 6, 0, 1, 5, INF},
{INF, 3, 1, 0, 7, 8},
{INF, INF, 5, 7, 0, 9},
{INF, INF, INF, 8, 9, 0}
};
int n = graph.length; // 图的顶点数
int[] parent = new int[n]; // 存储每个顶点在最小生成树中的父节点
int[] dist = new int[n]; // 存储每个顶点到最小生成树的距离
boolean[] visited = new boolean[n]; // 标记每个顶点是否已加入最小生成树
// 初始化dist数组和visited数组
Arrays.fill(dist, INF);
Arrays.fill(visited, false);
// 从顶点0开始构建最小生成树
dist[0] = 0;
parent[0] = -1; // 根节点没有父节点
// 重复n次,每次加入一个顶点
for (int i = 0; i < n; i++) {
// 选取距离最小的未加入最小生成树的顶点
int u = minDistance(dist, visited);
visited[u] = true;
// 更新与u相邻的顶点的距离和父节点
for (int v = 0; v < n; v++) {
if (graph[u][v] != 0 && !visited[v] && graph[u][v] < dist[v]) {
parent[v] = u;
dist[v] = graph[u][v];
}
}
}
// 输出最小生成树的边
System.out.println("最小生成树的边:");
for (int i = 1; i < n; i++) {
System.out.println(parent[i] + " - " + i + "\t" + graph[parent[i]][i]);
}
}
// 返回距离最小的未加入最小生成树的顶点
private static int minDistance(int[] dist, boolean[] visited) {
int minDist = INF;
int minIndex = -1;
for (int i = 0; i < dist.length; i++) {
if (!visited[i] && dist[i] < minDist) {
minDist = dist[i];
minIndex = i;
}
}
return minIndex;
}
}
运行结果:
最小生成树的边:
0 - 1 2
1 - 3 3
3 - 2 1
2 - 4 5
3 - 5 8
``
原文地址: https://www.cveoy.top/t/topic/ffEt 著作权归作者所有。请勿转载和采集!