import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class PrimMST {
static class Vertex {
public String name;
public int distance = Integer.MAX_VALUE;
public Vertex parent = null;
public Vertex(String name) {
this.name = name;
}
}
static class Edge {
public Vertex from;
public Vertex to;
public int weight;
public Edge(Vertex from, Vertex to, int weight) {
this.from = from;
this.to = to;
this.weight = weight;
}
}
static class Graph {
private Map<String, Vertex> vertices = new HashMap<>();
private List<Edge> edges = new ArrayList<>();
public void addVertex(String name) {
vertices.put(name, new Vertex(name));
}
public void addEdge(String from, String to, int weight) {
Vertex vFrom = vertices.get(from);
Vertex vTo = vertices.get(to);
edges.add(new Edge(vFrom, vTo, weight));
}
public List<Edge> getMST() {
List<Edge> mst = new ArrayList<>();
Set<Vertex> visited = new HashSet<>();
Vertex start = vertices.values().iterator().next();
start.distance = 0;
while (visited.size() < vertices.size()) {
Vertex minVertex = findMinDistanceVertex(visited);
visited.add(minVertex);
if (minVertex.parent != null) {
mst.add(new Edge(minVertex.parent, minVertex, minVertex.distance));
}
updateDistances(minVertex, visited);
}
return mst;
}
private Vertex findMinDistanceVertex(Set<Vertex> visited) {
Vertex minVertex = null;
int minDistance = Integer.MAX_VALUE;
for (Vertex v : vertices.values()) {
if (!visited.contains(v) && v.distance < minDistance) {
minVertex = v;
minDistance = v.distance;
}
}
return minVertex;
}
private void updateDistances(Vertex vertex, Set<Vertex> visited) {
for (Edge edge : edges) {
if (edge.from == vertex && !visited.contains(edge.to) && edge.weight < edge.to.distance) {
edge.to.distance = edge.weight;
edge.to.parent = vertex;
}
}
}
}
public static void main(String[] args) {
Graph graph = new Graph();
graph.addVertex("A");
graph.addVertex("B");
graph.addVertex("C");
graph.addVertex("D");
graph.addVertex("E");
graph.addEdge("A", "B", 2);
graph.addEdge("A", "C", 4);
graph.addEdge("B", "C", 1);
graph.addEdge("B", "D", 5);
graph.addEdge("C", "E", 3);
graph.addEdge("D", "E", 2);
List<Edge> mst = graph.getMST();
System.out.println("最小生成树:");
for (Edge edge : mst) {
System.out.println(edge.from.name + " - " + edge.to.name + " : " + edge.weight);
}
}
}