最小生成树之prim算法

来源:互联网 发布:sql语句编写技巧 编辑:程序博客网 时间:2024/06/07 01:38

算法思想

  假设N=(V,{E})是连通网,TE是N上最小生成树中边的集合。算法从U={u0}(u0∈V),TE={}开始。重复执行下述操作:在所有u∈U,v∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v并入U,直至U=V为止。此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树。

大话数据结构中Prim算法的讲解




个人心得:

在Prim算法中,lowcost数组保存的是结点数据,其中为0的结点是比较过的。一开始lowcost[8]={0,10,65535,65535,65535,11,65535,65535,65535},因为0是本身结点不用比较,所以为0。

在17-25行代码中,找到了lowcost中的最小值,10,其下标为1,故lowcost[1]变为0,因为比较过,此时lowcost[8]={0,0,65535,65535,65535,11,65535,65535,65535}.

28-35行代码是最难理解的,我思考了好久——为什么要这样比较?

我们回到最初的代码,lowcost[MAXVER]是保存相关顶点间边的权值,而在17-25行代码中也仅仅是寻找lowcost数组中的最小值。

灵机一动,对了,每次寻找已找到顶点邻接边的最小权值都是在lowcost中寻找,所以lowcost[j]需要跟已找到结点的邻接边权值比较,将最小的权值放入lowcost数组中,每次只需要寻找哦lowcost数组中最小值即可。

我们再来看下adjvex数组的作用——保存相关顶点下标!很关键,对吧?k是我们找到顶点的下边,if(lowcost[j]!=0&&G.arc[k][j]<lowcost[j]){lowcost[j] = G.arc[k][j];adjvex[j] = k;} 这里的作用是把arc[k][j]中比lowcost数组中权值小的边放入其中

adjvex的作用是保存其中边的结点,如lowcost[8]={0,0,65535,65535,65535,11,65535,65535,65535},adjvex={0,0,1,0,0,0,1,0,1},0为结点0,1是结点1.


关键点:每次都是寻找lowcost数组中的最小值。

Java可执行代码:

mport java.util.Scanner;public class PrimTest{public static void main(String args[]){Scanner in = new Scanner(System.in);System.out.println("请输入节点数:");int Ver = in.nextInt();int[][] arr = new int[Ver][Ver];for(int i = 0;i<Ver;i++)//初始化邻接矩阵表for(int j = 0;j<Ver;j++)if(i == j){arr[i][j]=0;}else arr[i][j]=65536;System.out.println("请输入边数:");int edges = in.nextInt();System.out.println("请输入各边连接情况:");for(int i = 0;i<edges;i++){//输出各边权值int k = in.nextInt();int j = in.nextInt();arr[k][j] = in.nextInt();arr[j][k] = arr[k][j];}int min,i,j,k;int adjvex[] = new int[Ver];//保存相关顶点下边int lowcost[] = new int[Ver];//保存相关顶点间的权值;for(int p = 0;p<Ver;p++){lowcost[p] = arr[0][p];//将v0顶点与之有边的权值存入数组lowcost中adjvex[p] = 0;//初始化v0的下标;}for(i = 1;i<Ver;i++){min = 65535;k = 0;for(j = 1;j<Ver;j++){if(lowcost[j]!=0&&lowcost[j]<min){min = lowcost[j];k = j;}}System.out.print("("+adjvex[k]+","+k+")");lowcost[k] = 0;for(j = 1;j<Ver;j++){if(lowcost[j]!=0&&lowcost[j]>arr[k][j]){lowcost[j] = arr[k][j];adjvex[j] = k;}}}in.close();}}


原创粉丝点击