Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions Java/graphs/KruskalAlgorithm.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import java.util.*;

class Edge implements Comparable<Edge> {
int src, dest, weight;

public int compareTo(Edge compareEdge) {
return this.weight - compareEdge.weight;
}
}

class Subset {
int parent, rank;
}

public class KruskalAlgorithm {

int V, E; // Vertices and Edges
Edge[] edges;

KruskalAlgorithm(int v, int e) {
V = v;
E = e;
edges = new Edge[E];
for (int i = 0; i < e; ++i)
edges[i] = new Edge();
}

int find(Subset[] subsets, int i) {
if (subsets[i].parent != i)
subsets[i].parent = find(subsets, subsets[i].parent);
return subsets[i].parent;
}

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++;
}
}

void kruskalMST() {
Edge[] result = new Edge[V];
int e = 0;
int i = 0;

for (i = 0; i < V; ++i)
result[i] = new Edge();

Arrays.sort(edges);

Subset[] subsets = new Subset[V];
for (i = 0; i < V; ++i) {
subsets[i] = new Subset();
subsets[i].parent = i;
subsets[i].rank = 0;
}

i = 0;
while (e < V - 1 && i < E) {
Edge nextEdge = edges[i++];

int x = find(subsets, nextEdge.src);
int y = find(subsets, nextEdge.dest);

if (x != y) {
result[e++] = nextEdge;
union(subsets, x, y);
}
}

System.out.println("Edges in Minimum Spanning Tree (Kruskal):");
for (i = 0; i < e; ++i)
System.out.println(result[i].src + " -- " + result[i].dest + " == " + result[i].weight);
}

public static void main(String[] args) {
int V = 4;
int E = 5;
KruskalAlgorithm graph = new KruskalAlgorithm(V, E);

graph.edges[0].src = 0; graph.edges[0].dest = 1; graph.edges[0].weight = 10;
graph.edges[1].src = 0; graph.edges[1].dest = 2; graph.edges[1].weight = 6;
graph.edges[2].src = 0; graph.edges[2].dest = 3; graph.edges[2].weight = 5;
graph.edges[3].src = 1; graph.edges[3].dest = 3; graph.edges[3].weight = 15;
graph.edges[4].src = 2; graph.edges[4].dest = 3; graph.edges[4].weight = 4;

graph.kruskalMST();
}
}