最小生成树之普里姆算法(贪心算法思想)

最小生成树的求法普遍有普里姆算法克鲁斯卡尔算法。这篇文章主要介绍一下我自己对普里姆算法的理解,适合所有人的学习。
最小生成树:
概念:给定一个带权的无向连通图 ,如何选取一颗生成树,使树上所有边上权的总和为最小,这叫最小生成树。
特点:
1)n个顶点,一定有n-1条边;
2)包含全部顶点;
3)n-1条边都在图中。
以下例来具体说明。
求其最小生成树在这里插入图片描述

普里姆算法:
假设G=(V,E)是联通网,T=(U,D)是最小生成树,V,U是顶点集合,E,D是边的集合。
1)从顶点A开始构造最小生成树,从V中取出A放到U,将A标记为access[A的下标]=1。
<构造一个access[]数组,用来存放已经访问过的节点>
2)若集合U中的顶点Ui与V-U中的顶点Vi之间存在边,则寻找这些边中间***权值最小***的,但***不构成回路***的顶点,把Vi它加入U中,将Vi标记为已访问。
3)一直循环,直到边数为顶点数减1结束。
Java代码如下:

package 最小生成树_普里姆算法;

public class Prim {
	//普里姆算法
	/**
	 * 
	 * @param graph 原始图
	 * @param v 开始计算的顶点的角标
	 */
	public static void prim(MGraph graph,int v) {
		int access[]=new int[graph.vertexs];//(access:访问)该数组存储访问过的顶点
		//将存储访问过顶点的数组初始化为0
		for(int i=0;i<access.length;i++) {
			access[i]=0;
		}
		//将传进来的顶点定义为已访问过
		access[v]=1;
		
		//记录顶点下标
		int v1=-1;//已经访问过的
		int v2=-1;//未访问过的
		//定义初始权重为1000
		int minweight=1000;
		
		for(int e=1;e<graph.vertexs;e++) {//最小生成树的边数:(顶点数-1)则成功,所以从1开始
			for(int i=0;i<graph.vertexs;i++) {//i表示访问过的节点
				for(int j=0;j<graph.vertexs;j++) {//j表示未访问过的节点
					//最重要的判断
					if(access[i]==1&&access[j]==0&&graph.weight[i][j]<minweight) {
						minweight=graph.weight[i][j];
						v1=i;
						v2=j;
					}
				}
			}
			System.out.println("边<"+graph.data[v1]+","+graph.data[v2]+">权值为"+minweight);
			access[v2]=1;
			minweight=1000;
		}
	}
}

此为执行结果。此为执行结果。
图中不直接连接的顶点间的权值用1000代表。

此算法的性质为贪心算法,且其时间复杂度较高,每次遍历时间较长。
希望对你们有帮助。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值