使用Prim算法求图的最小生成树(MST)Java
时间: 2023-07-22 18:26:24 浏览: 84
图的生成树-北京大学最小生成树(MST)问题及其扩展
好的,我可以帮你解答这个问题。Prim算法是一种常见的求图的最小生成树的算法,其基本思想是从一个单独的节点开始,逐步将与该节点相连的权重最小的边加入最小生成树中,直到所有节点都被加入为止。以下是使用Java实现Prim算法求图的最小生成树的代码:
```java
import java.util.*;
public class PrimMST {
// 计算最小生成树的方法
public static List<Edge> primMST(List<Vertex> vertices) {
// 存储已经在最小生成树中的节点
Set<Vertex> mstSet = new HashSet<>();
// 存储还未加入最小生成树的节点
PriorityQueue<Edge> edgeQueue = new PriorityQueue<>();
// 存储最小生成树的边
List<Edge> mst = new ArrayList<>();
// 从第一个节点开始
Vertex start = vertices.get(0);
mstSet.add(start);
edgeQueue.addAll(start.getEdges());
// 当所有节点都被加入最小生成树时结束
while (mstSet.size() < vertices.size()) {
// 找到与当前最小生成树相连的权重最小的边
Edge minEdge = edgeQueue.poll();
Vertex next = minEdge.getDest();
// 如果边的目的节点还未被加入最小生成树,则将其加入
if (!mstSet.contains(next)) {
mstSet.add(next);
mst.add(minEdge);
edgeQueue.addAll(next.getEdges());
}
}
return mst;
}
// 测试代码
public static void main(String[] args) {
List<Vertex> vertices = new ArrayList<>();
Vertex v1 = new Vertex("A");
Vertex v2 = new Vertex("B");
Vertex v3 = new Vertex("C");
Vertex v4 = new Vertex("D");
Vertex v5 = new Vertex("E");
vertices.add(v1);
vertices.add(v2);
vertices.add(v3);
vertices.add(v4);
vertices.add(v5);
v1.addEdge(new Edge(v1, v2, 2));
v1.addEdge(new Edge(v1, v3, 4));
v2.addEdge(new Edge(v2, v3, 1));
v2.addEdge(new Edge(v2, v4, 7));
v3.addEdge(new Edge(v3, v4, 3));
v3.addEdge(new Edge(v3, v5, 5));
v4.addEdge(new Edge(v4, v5, 6));
List<Edge> mst = primMST(vertices);
System.out.println("最小生成树:");
for (Edge e : mst) {
System.out.println(e.getSource().getName() + " -- " + e.getDest().getName() + " : " + e.getWeight());
}
}
}
class Vertex {
private String name;
private List<Edge> edges;
public Vertex(String name) {
this.name = name;
edges = new ArrayList<>();
}
public String getName() {
return name;
}
public List<Edge> getEdges() {
return edges;
}
public void addEdge(Edge e) {
edges.add(e);
}
}
class Edge implements Comparable<Edge>{
private Vertex source;
private Vertex dest;
private int weight;
public Edge(Vertex source, Vertex dest, int weight) {
this.source = source;
this.dest = dest;
this.weight = weight;
}
public Vertex getSource() {
return source;
}
public Vertex getDest() {
return dest;
}
public int getWeight() {
return weight;
}
@Override
public int compareTo(Edge other) {
return Integer.compare(weight, other.weight);
}
}
```
这个代码中,`Vertex`类代表节点,包含节点的名称和与该节点相连的边,`Edge`类代表边,包含边的起点、终点和权重。`PrimMST`类包含一个静态方法`primMST`,计算并返回最小生成树,该方法接收一个节点列表作为输入。在测试代码中,我们创建了一个包含5个节点的图,并计算了它的最小生成树。
阅读全文