您的位置:首页 > 编程语言 > Java开发

Kruskal生成树算法的java代码简单实现

2014-06-28 15:26 936 查看
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>}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: