package kruskal;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
class EdgeCom implements Comparator<EdgeNode>{
@Override
public int compare(EdgeNode o1, EdgeNode o2) {
return o1.weight>=o2.weight?1:-1;
}
}
public class Graph {
int v;
int e;
EdgeNode[] edges;
public Graph(int v,int e){
this.v = v;
this.e = e;
edges = new EdgeNode[e];
}
public void addEdge(EdgeNode e,int i){
edges[i] = e;
}
public int find(Subsets[] set,int i){
if(set[i].parent==i){
return i;
}
set[i].parent = find(set, set[i].parent);
return set[i].parent;
}
public void union(Subsets[] set,int x,int y){
int xp = find(set, x);
int yp = find(set, y);
if(xp!=yp){
if(set[xp].rank<set[yp].rank){
set[xp].parent = yp;
}else if(set[xp].rank>set[yp].rank){
set[yp].parent = xp;
}else{
set[xp].parent = yp;
set[yp].rank++;
}
}
}
public List<EdgeNode> getKruskalTree(){
LinkedList<EdgeNode> list = new LinkedList<>();
Arrays.sort(this.edges, new EdgeCom());
Subsets[] set = new Subsets[v];
for(int i=0;i<v;i++){
set[i] = new Subsets(i, 0);
}
for(int i=0;i<e;i++){
EdgeNode edge = edges[i];
int src = edge.src;
int des = edge.des;
int x = find(set, src);
int y = find(set, des);
if(x!=y){
list.add(edge);
}
union(set, src, des);
}
return list;
}
public void print(List<EdgeNode> list){
for(EdgeNode temp:list){
System.out.println(temp.src+" "+ temp.des+" "+temp.weight+" ");
}
}
public static void main(String[] args) {
Graph g = new Graph(7, 9);
g.addEdge(new EdgeNode(0, 3, 1), 0);
g.addEdge(new EdgeNode(5, 6, 1), 1);
g.addEdge(new EdgeNode(0, 1, 2), 2);
g.addEdge(new EdgeNode(2, 3, 2), 3);
g.addEdge(new EdgeNode(1, 3, 3), 4);
g.addEdge(new EdgeNode(0, 2, 4), 5);
g.addEdge(new EdgeNode(3, 6, 4), 6);
g.addEdge(new EdgeNode(2, 5, 5), 7);
g.addEdge(new EdgeNode(4, 6, 6), 8);
List<EdgeNode> list = g.getKruskalTree();
g.print(list);
}
}
package kruskal;
public class EdgeNode {
int src;
int des;
int weight;
EdgeNode next;
<span style="white-space:pre"> </span>public EdgeNode(int src, int des, int weight) {
<span style="white-space:pre"> </span>this.src = src;
<span style="white-space:pre"> </span>this.des = des;
<span style="white-space:pre"> </span>this.weight = weight;
<span style="white-space:pre"> </span>}
}
package kruskal;
public class Subsets {
<span style="white-space:pre"> </span>int parent;
<span style="white-space:pre"> </span>int rank;
<span style="white-space:pre"> </span>public Subsets(int parent, int rank) {
<span style="white-space:pre"> </span>this.parent = parent;
<span style="white-space:pre"> </span>this.rank = rank;
<span style="white-space:pre"> </span>}
}