克鲁斯卡尔算法

设有一个有n个顶点的连通网N={V,E},最初先构造一个只有n个顶点,没有边的非连通图T={V, E},图中每个顶点自成一个连通分量。当在E中选到一条具有最小权值的边时,若该边的两个顶点落在不同的连通分量上,则将此边加入到T中;否则将此边舍去,重新选择一条权值最小的边。如此重复下去,直到所有顶点在同一个连通分量上为止。

图解

package kruskal;

import java.util.ArrayList;
import java.util.List;

public class Kruskal {
	public static void main(String[] args) {
		//构造图
		Graph graph=new Graph(10);
		graph.addNode('A');
		graph.addNode('B');
		graph.addNode('C');
		graph.addNode('D');
		graph.addNode('E');
		graph.addNode('F');
		graph.addNode('G');
		graph.addNode('H');
		graph.addNode('I');
		graph.addNode('J');
		graph.addEdge(0, 1, 2);
		graph.addEdge(0, 5, 10);
		graph.addEdge(1, 2, 4);
		graph.addEdge(1, 6, 3);
		graph.addEdge(1, 7, 6);
		graph.addEdge(2, 3, 8);
		graph.addEdge(3, 4, 30);
		graph.addEdge(3, 9, 21);
		graph.addEdge(4, 9, 9);
		graph.addEdge(5, 6, 20);
		graph.addEdge(7, 8, 7);
		graph.addEdge(8, 9, 16);
		
		//获取边集
		Edge edge=new Edge();
		edge.formart(graph.getEdge());//把图的临界矩阵转化成边集
		
		List<Edge> list=edge.getList();//获取到排序的边集
		
		//
		ArrayList<ArrayList<Integer>> tatol=new ArrayList<ArrayList<Integer>>();
		 
		for(int i=0;i<list.size();i++){
			//获取边的顶点
			 int start=list.get(i).getStart();
			 int end=list.get(i).getEnd();
			 //拿到顶点所属的集合
			 ArrayList<Integer> s=getIndex(tatol,start);
			 ArrayList<Integer> e=getIndex(tatol, end);
			 if(s==null&&e==null){//判断这两个集合
				 //都不在
				 ArrayList<Integer> temp=new ArrayList<Integer>();
				 temp.add(start);
				 temp.add(end);
				 tatol.add(temp);
				 System.out.println(list.get(i));
			 }else if(s!=null&&e==null){
				 //start在,而end不再
				 s.add(end);
				 System.out.println(list.get(i));
			 }else if(s==null&&e!=null){
				 //start不再,end在
				 e.add(start);
				 System.out.println(list.get(i));
			 }else if(s!=null&&e!=null&&s!=e){
				//两个都在,在不同的集合中,
				 ArrayList<Integer> temp=e;
				 tatol.remove(e);
				 s.addAll(temp);
				 System.out.println(list.get(i));
			 }else if(s!=null&&e!=null&&s==e){
				 //都在同一集合中
				 continue;
			 }
			
		}	
		
		 
		System.out.println(tatol.size());
		
	}
	//返回顶点所属的集合
	public static ArrayList<Integer>  getIndex(ArrayList<ArrayList<Integer>> tatol,int index){
		for(int i=0;i<tatol.size();i++){
			if(tatol.get(i).contains(index)){
				return tatol.get(i);
			}
		}
		return null;
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值