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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值