算法起步之Prim算法

简介: 原文: 算法起步之Prim算法            prim算法是另一种最小生成树算法。他的安全边选择策略跟kruskal略微不同,这点我们可以通过一张图先来了解一下。
原文: 算法起步之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】

目录
相关文章
|
算法
最小生成树算法:Prim算法
在图论中,最小生成树(Minimum Spanning Tree,简称MST)是一种常用的算法问题。最小生成树是指在一个加权连通图中选取边的子集,使得所有顶点都被覆盖,并且边的总权值最小。
317 0
|
3月前
|
算法 决策智能
基于prim算法求出网络最小生成树实现网络社团划分和规划
该程序使用MATLAB 2022a版实现路线规划,通过排序节点权值并运用Prim算法生成最小生成树完成网络规划。程序基于TSP问题,采用遗传算法与粒子群优化算法进行路径优化。遗传算法通过编码、选择、交叉及变异操作迭代寻优;粒子群优化算法则通过模拟鸟群觅食行为,更新粒子速度和位置以寻找最优解。
|
5月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
6月前
|
机器学习/深度学习 人工智能 算法
|
7月前
|
算法 C语言
数据结构与算法——最小生成树问题(什么是最小生成树、Prim算法、Kruskal算法)
数据结构与算法——最小生成树问题(什么是最小生成树、Prim算法、Kruskal算法)
46 0
|
算法 C++
用prim和kruskal算法求最小生成树问题
用prim和kruskal算法求最小生成树问题
89 0
|
供应链 算法 Java
java数据结构最经济的地下通道建设方案prim算法
MX是世界上第一大传媒娱乐企业,该公司数十年的经营历史中创作了很多经典影片,此外还经营着很多的规模十分宏大世界级的主题娱乐公园。最近MX公司刚和C国X城市达成协定,共同投资建设C国国内唯一一家主题娱乐公园。
70 0
|
算法
秒懂算法 | Prim算法
实例演示Prim算法运行过程。
136 0
秒懂算法 | Prim算法
|
算法 Java
数据结构(13)最小生成树JAVA版:prim算法、kruskal算法
13.1.概述 最小生成树,包含图的所有顶点的一棵树,树的边采用包含在图中的原有边中权重和最小的边。翻译成人话就是遍历一遍全图所有顶点的最短路径,这条路径就叫最小生成树。 最小生成树存在和图是连通图互为充要条件,顶点都不连通,肯定不可能有路能遍历一遍全图。 求解最小生成树有两种常用算法:
190 0
|
算法
Prim算法和Kruskal算法到底哪个好?
Prim算法和Kruskal算法到底哪个好?
228 0