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

算法起步之Prim算法

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

           prim算法是另一种最小生成树算法。他的安全边选择策略跟kruskal略微不同,这点我们可以通过一张图先来了解一下。

           prim算法的安全边是从与当前生成树相连接的边中选择一条最短的一条,并且该边是应是生成树与生成树外一点的连接。

           所以我们prim算法用汉字描述的过程应为:1初始化2构造最小优先队列,将所有节点都加入到最小优先队列中,所有节点的key设置为无穷大,开始节点设置成0。3循环,直到队列为空{取出key值最小的节点加入到生成树中,变量与key相连接的边,看是否是于树中的节点相连,如果不是且key值比队列中节点的key值小则更新队列中该节点的key值,最小优先队列排序}结束。

           下面的代码就是按照刚才的过程实现的,有很多需要优化的地方,当然算法还需要根据具体的题目,选择最好的写法,这里只是给出思想。

public class Prim {

	private int MAX=1000;
	private int NULL=-1;
	
	public void prim(int[][]map){
		Node[] nodes=new Node[map.length];
		ArrayList list=new ArrayList();
		for (int i = 1; i < map.length; i++) {
			list.add(new Node(i, NULL, MAX));
		}
		
		list.add(new Node(0,NULL,0));
		while(!list.isEmpty()){
			Collections.sort(list);
			Node n=(Node) list.remove(1);
			System.out.println(n.getValue()+","+n.getLink()+","+n.getKey());
			nodes[n.getValue()]=n;
			for (int i = 0; i < map.length; i++) {
				if(map[n.getValue()][i]!=0&&nodes[i]==null){
					for (Object o : list) {
						Node node=(Node) o;
						if(node.getKey()==i&&map[n.getLink()][i]<node.getValue()){
							node.setLink(n.getValue());
							node.setKey(map[n.getLink()][i]);
						}
					}
				}
				
			}
		}
	}
}
class Node implements Comparable<Node>{
	private int value;
	private int link;
	private int key;
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
	public int getLink() {
		return link;
	}
	public void setLink(int link) {
		this.link = link;
	}
	public int getKey() {
		return key;
	}
	public void setKey(int key) {
		this.key = key;
	}
	public Node(int value, int link, int key) {
		this.value = value;
		this.link = link;
		this.key = key;
	}
	@Override
	public int compareTo(Node o) {
		if (this.key>o.getKey()) {
			return -1;
		}
		return 1;
	}
	
}


友情提示:转载请注明出处【作者idlear    博客http://blog.csdn.net/idlear/article/details/19577841】

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

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

相关文章:

  • 我比谁都相信努力奋斗的意义
  • jsp页面中从forEach里向action里面传递其中的一个对象
  • CentOS版本选择说明
  • 读书笔记——《设计心理学2:如何管理复杂》教你应付复杂
  • 用户故事(User Story)
  • TQ2440开发板移植UBOOT-2010.06总结(3)
  • ext button 属性
  • IE,URL中文读取
  • python进阶一_简介,安装与环境部署
  • 判断投递失败原因方法
  • css入门
  • ToString()格式化输出
  • WPF中的属性触发器Trigger Property
  • PL/SQL中文乱码解决方法
  • wince 显示图片
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 2017-08-04 前端日报
  • 345-反转字符串中的元音字母
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • avalon2.2的VM生成过程
  • classpath对获取配置文件的影响
  • express.js的介绍及使用
  • java多线程
  • k8s如何管理Pod
  • Linux后台研发超实用命令总结
  • Python 反序列化安全问题(二)
  • Sass Day-01
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 探索 JS 中的模块化
  • 正则与JS中的正则
  • 选择阿里云数据库HBase版十大理由
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #include<初见C语言之指针(5)>
  • #include到底该写在哪
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #每日一题合集#牛客JZ23-JZ33
  • (1)STL算法之遍历容器
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (done) 两个矩阵 “相似” 是什么意思?
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .htaccess 强制https 单独排除某个目录
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net MVC中使用angularJs刷新页面数据列表
  • .Net Winform开发笔记(一)
  • .Net 中Partitioner static与dynamic的性能对比