import java.util.*; class KruskalAlgorithm { static class Edge { int source, destination, weight; public Edge(int source, int destination, int weight) { this.source = source; this.destination = destination; this.weight = weight; } } static class Subset { int parent, rank; } static int find(Subset[] subsets, int i) { if (subsets[i].parent != i) { subsets[i].parent = find(subsets, subsets[i].parent); } return subsets[i].parent; } static void union(Subset[] subsets, int x, int y) { int xroot = find(subsets, x); int yroot = find(subsets, y); if (subsets[xroot].rank < subsets[yroot].rank) { subsets[xroot].parent = yroot; } else if (subsets[xroot].rank > subsets[yroot].rank) { subsets[yroot].parent = xroot; } else { subsets[yroot].parent = xroot; subsets[xroot].rank++; } } static void kruskalMST(Edge[] edges, int V, int E) { Arrays.sort(edges, Comparator.comparingInt(e -> e.weight)); Edge[] result = new Edge[V - 1]; // The MST will have V-1 edges int e = 0; int i = 0; Subset[] subsets = new Subset[V]; for (int v = 0; v < V; ++v) { subsets[v] = new Subset(); subsets[v].parent = v; subsets[v].rank = 0; } while (e < V - 1) { Edge nextEdge = edges[i++]; int x = find(subsets, nextEdge.source); int y = find(subsets, nextEdge.destination); if (x != y) { result[e++] = nextEdge; union(subsets, x, y); } } System.out.println("Edges in the Minimum Spanning Tree:"); for (int j = 0; j < e; ++j) { System.out.println("Edge: " + result[j].source + " - " + result[j].destination + " with weight " + result[j].weight); } } public static void main(String[] args) { int V = 4; int E = 5; Edge[] edges = new Edge[E]; edges[0] = new Edge(0, 1, 10); edges[1] = new Edge(0, 2, 6); edges[2] = new Edge(0, 3, 5); edges[3] = new Edge(1, 3, 15); edges[4] = new Edge(2, 3, 4); kruskalMST(edges, V, E); } }