对普里姆算法的理解

算法截图

对普里姆算法的理解_第1张图片

具体代码

public class Index {
	static int count = 9;//结点个数
	static int[][] gra = new int[9][9];//邻接矩阵数组
	static {//初始化数组  设置0表示自身连接,65535不可能的权重(表示不连接)
		gra[0] =new int[]{0,10,65535,65535,65535,11,65535,65535,65535};
		gra[1] =new int[]{10,0,18,65535,65535,65535,16,65535,12};
		gra[2] =new int[]{65535,18,0,22,65535,65535,65535,65535,8};
		gra[3] =new int[]{65535,65535,22,0,20,65535,65535,16,21};
		gra[4] =new int[]{65535,65535,65535,20,0,26,65535,7,65535};
		gra[5] =new int[]{11,65535,65535,65535,26,0,17,65535,65535};
		gra[6] =new int[]{65535,16,65535,65535,65535,17,0,19,65535};
		gra[7] =new int[]{65535,65535,65535,16,7,65535,19,0,65535};
		gra[8] =new int[]{65535,12,8,21,65535,65535,65535,65535,0};
		
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int k = -1;//存放当前选中的结点,去-1是可以的,图中每个节点必有连线,所有数组中肯定存在小于65535的数
		int[] low = new int[count];//存放当前遍历结点后,与结点相连边最小的权重
		int[] adjVex = new int[count];//存放当前选中的结点的上一个结点
		for(int i=0;i"+"end:"+k);//打印
			
			for(int i=1;i

算法详解

  1. 前提:利用邻接矩阵,邻接矩阵以65535作为无穷大,表示两个节点没有连线,0表示自连
  2. 关键步骤
    1. 定义一个low数组,长度与结点个数相同。存放当前遍历结点后,与结点相连边最小的权重
    2. 定义一个adjVex数组,长度与结点个数相同。作用相当于存放边的起始位置
  3. 代码解释:
    1. 初始化,初始化low数组和adjVex数组,以创建最小树的第一个结点的数据进行初始化(算法以0结点开始)。

对普里姆算法的理解_第2张图片

    1. 进行生成最小生成树过程的循环,次数为结点个数减一(生成的树的边为n-1)
    2. 遍历low数组,找出数组中最小的值(0不算),获取下标k。此时的k对应的就是终点位置
    3. 此时用于标记边的起始位置的adjVex数组,adjVex[k]为起始位置。然后将low[k]置0(该权值已使用,不会在使用)

对普里姆算法的理解_第3张图片

    1. 更新low和adjVex数组。将找到的下标k对应的那一行邻接矩阵,将不等于0且对应下标位置小于low的进行更新,把更小的权值替换low对应位置,以及用adjVex记录起始下标(这也是为什么将low[k]=0,因为无论怎么更新,k下标的位置都为0)

对应的图

对普里姆算法的理解_第4张图片

 

你可能感兴趣的:(Java数据结构)