import java.util.*;
public class KruskalMST {
static class Edge implements Comparable<Edge> {
int src, dest, weight;
public Edge(int src, int dest, int weight) {
this.src = src;
this.dest = dest;
this.weight = weight;
}
@Override
public int compareTo(Edge other) {
return this.weight - other.weight;
}
}
static class DisjointSet {
int[] parent;
int[] rank;
public DisjointSet(int n) {
parent = new int[n];
rank = new int[n];
for (int i = 0; i < n; i++) {
parent[i] = i;
rank[i] = 0;
}
}
public int find(int u) {
if (parent[u] != u) {
parent[u] = find(parent[u]);
}
return parent[u];
}
public void union(int u, int v) {
int uRoot = find(u);
int vRoot = find(v);
if (uRoot == vRoot) {
return;
}
if (rank[uRoot] < rank[vRoot]) {
parent[uRoot] = vRoot;
} else if (rank[uRoot] > rank[vRoot]) {
parent[vRoot] = uRoot;
} else {
parent[vRoot] = uRoot;
rank[uRoot]++;
}
}
}
public static void kruskalMST(List<Edge> edges, int numVertices) {
Collections.sort(edges);
DisjointSet disjointSet = new DisjointSet(numVertices);
List<Edge> mst = new ArrayList<>();
for (Edge edge : edges) {
int src = edge.src;
int dest = edge.dest;
if (disjointSet.find(src) != disjointSet.find(dest)) {
mst.add(edge);
disjointSet.union(src, dest);
}
}
System.out.println("最小生成树:");
for (Edge edge : mst) {
System.out.println("(" + edge.src + ", " + edge.dest + ") : " + edge.weight);
}
}
public static void main(String[] args) {
List<Edge> edges = new ArrayList<>();
edges.add(new Edge(0, 1, 4));
edges.add(new Edge(0, 2, 4));
edges.add(new Edge(1, 2, 2));
edges.add(new Edge(1, 3, 3));
edges.add(new Edge(2, 3, 3));
edges.add(new Edge(2, 4, 2));
edges.add(new Edge(3, 4, 1));
int numVertices = 5;
kruskalMST(edges, numVertices);
}
}