用java写出prim算法的实现
时间: 2023-06-03 13:04:57 浏览: 87
prim算法的实现
可以的,以下是Prim算法的Java实现:
```java
public class PrimAlgorithm {
public void prim(int[][] graph) {
int vertices = graph.length;
// 用于记录当前所有未加入MST的顶点到MST中距离最小的顶点的集合
Set<Integer> visited = new HashSet<>();
// 用于记录每个顶点到MST中距离最小的顶点的距离
int[] distance = new int[vertices];
// 用于记录当前所有未加入MST的顶点到MST中距离最小的顶点
int[] parent = new int[vertices];
// 初始化distance数组和parent数组
for (int i = 0; i < vertices; i++) {
distance[i] = Integer.MAX_VALUE;
parent[i] = -1;
}
// 选择0作为MST的起点
distance[0] = 0;
// 添加起点0到visited集合中
visited.add(0);
// 找出MST中的所有顶点
for (int i = 0; i < vertices - 1; i++) {
int minVertex = -1;
int minDistance = Integer.MAX_VALUE;
// 遍历当前所有未加入MST的顶点
for (int j = 0; j < vertices; j++) {
if (!visited.contains(j) && distance[j] < minDistance) {
// 更新距离最小的顶点
minVertex = j;
minDistance = distance[j];
}
}
// 将距离最小的顶点添加到visited集合中,并更新distance和parent数组
visited.add(minVertex);
for (int k = 0; k < vertices; k++) {
if (graph[minVertex][k] != 0 && !visited.contains(k) &&
graph[minVertex][k] < distance[k]) {
distance[k] = graph[minVertex][k];
parent[k] = minVertex;
}
}
}
// 输出MST边的信息
System.out.println("Edge \tWeight");
for (int i = 1; i < vertices; i++) {
System.out.println(parent[i] + " - " + i + " \t" + graph[i][parent[i]]);
}
}
public static void main(String[] args) {
// 测试Prim算法
PrimAlgorithm p = new PrimAlgorithm();
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}};
p.prim(graph);
}
}
```
阅读全文