当前位置: 首页 > news >正文

算法起步之Kruskal算法

算法起步之Kruskal算法
原文: 算法起步之Kruskal算法

         说完并查集我们接着再来看这个算法,趁热打铁嘛。什么是最小生成树呢,很形象的一个形容就是铺自来水管道,一个村庄有很多的农舍,其实这个村庄我们可以看成一个图,而农舍就是图上的每个节点,节点之间有很多的路径,而铺自来水管道目的就是为了让每家都能用上自来水,而至于自来水怎么铺就不关心了,而铺管子的人就会想如何才能最生材料,那么最省材料的一条路径就是我们这个图的最小生成树。而如何去构建一个最小生成树呢?这个就用到了我们之前说的贪心策略。这里的觉得点就是一直寻找安全边,所以构建最小生成树的过程可以描述成,循环一直寻找安全边加入到树中,直到树中包含所有节点,什么是安全边?安全边的定义就是假设集合A是我们的最小生成树的子集,每一步都是选择一条边是的A还是最小生成树的子集则那条边就是安全边。

        根据安全边选择策略不同有两种最短路径算法,分别是Kruskal算法跟prim算法。我们先来说Kruskal算法。首先我们先看一下图,我觉得图比说要好理解的多。



       大家可能已经看出来了,kruskal算法寻找安全边的方式,就是在所有的边中找最小的表,只要两个节点是两个不相交集合,就加入到最小生成树中,直到所有的节点都连接起来。我用汉字写一下伪代码:

       1循环所有的边;2构建一个最小优先队列;3构建一个并查集;4直到构建成最小生成树{  从优先队列取出一个值,判断两个节点是不是不相交集合,是否加入到最小树中。  }结束

下面我们就安装伪代码来写。可能相比之前的代码要多一点,但是基本思想都一样,代码多是因为要写一个javabean跟实现一个并查集,并查集我们在上一篇已经讲过http://blog.csdn.net/idlear/article/details/19556587,最小优先队列也已经说过http://blog.csdn.net/idlear/article/details/18997685大家可以参考之前的文章。

这个是边的javabean不需要解释了吧。

class Bian implements Comparable<Bian>{
	private int left;
	private int right;
	private int value;
	public Bian(int i, int j, int k) {
		this.left=i;
		this.right=j;
				this.value=k;
	}
	public int getLeft() {
		return left;
	}
	public void setLeft(int left) {
		this.left = left;
	}
	public int getRight() {
		return right;
	}
	public void setRight(int right) {
		this.right = right;
	}
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
	@Override
	public int compareTo(Bian o) {
		if (this.getValue()>o.getValue()) {
			return -1;
		}
		return 1;
	}
}


并查集。

class Ufs{
	private int[] father;
	private int[] rank;

	public void makeset(int max) {
		father = new int[max];
		rank = new int[max];
		for (int i = 0; i < father.length; i++) {
			father[i] = i;
		}
	}

	public void union(int x, int y) {
		if (rank[x] > rank[y]) {
			father[y] = x;
		} else {
			if (rank[x] == rank[y]) {
				rank[y]++;
			}
			father[x] = y;
		}
	}

	public int findset(int x) {
		if (father[x] != x) {
			father[x] = findset(father[x]);
		}
		return father[x];
	}
}

        核心代码其实就是一个循环过程,而之前的代码也全是在先前的准备工作。这里如果有几个类没有见过都是java中的工具类,这些类的作用可以查一下api文档。

public void kruskal(int[][] map) {
		
		Ufs ufs=new Ufs();
		ufs.makeset(map.length);
		ArrayList list=new ArrayList();
		for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map.length; j++) {
				if(map[i][j]!=0){
					Bian b=new Bian(i,j,map[i][j]);
					list.add(b);
				}
			}
		}
		int max=0;
		while(max<=map.length-1){
			Collections.sort(list);
			Bian b=(Bian) list.remove(1);
			int x=b.getLeft();
			int y=b.getRight();
			if(ufs.findset(x)!=ufs.findset(y)){
				ufs.union(x, y);
				System.out.println("连接"+x+","+y+"路径长度为"+b.getValue());
				max++;
			}
		}
	}
              友情提示:转载请注明出处【作者idlear    博客http://blog.csdn.net/idlear/article/details/19301373】

posted on 2014-02-23 15:34 NET未来之路 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/3561999.html

相关文章:

  • 回文自动机学习笔记
  • 深入理解Java类加载器(ClassLoader)
  • @我的前任是个极品 微博分析
  • DOS操作系统
  • Linux基础学习(14)--日志管理
  • 如何查看 Linux 中所有正在运行的服务
  • 两款测试管理工具:TestLink 与飞蛾深度横评
  • 信号导致的问题
  • Java 网页抓取 工具类
  • htmlUnil-2.33 jar包
  • WCF学习总结
  • javascript模拟鸟群使用cax和threejs渲染引擎
  • 18-07-31
  • Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题...
  • QM课程03-采购中的质量管理
  • C++类的相互关联
  • crontab执行失败的多种原因
  • FineReport中如何实现自动滚屏效果
  • Hibernate【inverse和cascade属性】知识要点
  • js对象的深浅拷贝
  • nginx 配置多 域名 + 多 https
  • NSTimer学习笔记
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • React中的“虫洞”——Context
  • 复杂数据处理
  • 记一次用 NodeJs 实现模拟登录的思路
  • 配置 PM2 实现代码自动发布
  • 区块链分支循环
  • 数据结构java版之冒泡排序及优化
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 一天一个设计模式之JS实现——适配器模式
  • 怎么将电脑中的声音录制成WAV格式
  • 白色的风信子
  • 阿里云重庆大学大数据训练营落地分享
  • ​secrets --- 生成管理密码的安全随机数​
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)常见O(n^2)排序算法解析
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (LeetCode) T14. Longest Common Prefix
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (ros//EnvironmentVariables)ros环境变量
  • (二)c52学习之旅-简单了解单片机
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (四)Controller接口控制器详解(三)
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • [20190113]四校联考
  • [3D基础]理解计算机3D图形学中的坐标系变换