1. public class Prim {
  2.  
  3. static int MAX = 65535;
  4. public static void prim(int[][] graph, int n){
  5.  
  6. char[] c = new char[]{'A','B','C','D','E','F','G','E','F'};
  7. int[] lowcost = new int[n];
  8. int[] mst = new int[n];
  9. int i, j, min, minid, sum = 0;
  10.  
  11. for(i = 1; i < n; i++){
  12. lowcost[i] = graph[0][i];
  13. mst[i] = 0;
  14. }
  15.  
  16. for(i = 1; i < n; i++){
  17.  
  18. min = MAX;
  19. minid = 0;
  20. for(j = 1; j < n; j++){
  21. if (lowcost[j] < min && lowcost[j] != 0) {
  22. min = lowcost[j];
  23. minid = j;
  24. }
  25. }
  26. System.out.println(c[mst[minid]] + "到" + c[minid] + " 权值:" + min);
  27.  
  28. sum += min;
  29. lowcost[minid] = 0;
  30.  
  31. for (j = 1; j < n; j++) {
  32. if (graph[minid][j] < lowcost[j]) {
  33. lowcost[j] = graph[minid][j];
  34. mst[j] = minid;
  35. }
  36. }
  37. }
  38.  
  39. System.out.println("sum:" + sum);
  40.  
  41. }
  42.  
  43. public static void main(String[] args) {
  44. int[][] map = new int[][]{
  45. {0,10,MAX,MAX,MAX,11,MAX,MAX,MAX},
  46. {10,0,18,MAX,MAX,MAX,16,MAX,12},
  47. {MAX,MAX,0,22,MAX,MAX,MAX,MAX,8},
  48. {MAX,MAX,22,0,20,MAX,MAX,16,21},
  49. {MAX,MAX,MAX,20,0,26,MAX,7,MAX},
  50. {11,MAX,MAX,MAX,26,0,17,MAX,MAX},
  51. {MAX,16,MAX,MAX,MAX,17,0,19,MAX},
  52. {MAX,MAX,MAX,16,7,MAX,19,0,MAX},
  53. {MAX,12,8,21,MAX,MAX,MAX,MAX,0}
  54. };
  55. prim(map, map.length);
  56. }
  57.  
  58. }

输出结果:

  1. AB 权值:
  2. AF 权值:
  3. BF 权值:
  4. FC 权值:
  5. BG 权值:
  6. GE 权值:
  7. EE 权值:
  8. ED 权值:
  9. sum:
 
prim算法的思想:
  • 初始化时,v0加入到最小树,其他所有顶点作为未加入树的集合
  • 取矩阵中第一横,lowcost[],其实就是v0与其他顶点的距离,找出最小的,比如v4,v4加入到最小树,此时最小数有两个节点了v0和v4
  • 接下来,要找到其他未加入树顶点中与最小树顶点距离最近的那个点
    • lowcost[]这是v0的数据
    • 找到v4与其他顶点的距离数据,即矩阵的第5横 tmp[]
    • 然后rmp[]和lowcost[]纵向对比大小,小的数据设置到lowcost[]
    • 然后横向对比lowcost[]数据,找到最小点X,这个X即为与最小树距离最近的那个点
  • 同理,依次将所有顶点加入到最小树

WIKI解释

图例 说明 不可选 可选 已选
此为原始的加权连通图。每条边一侧的数字代表其权值。 - - -
顶点D被任意选为起始点。顶点ABEF通过单条边与D相连。A是距离D最近的顶点,因此将A及对应边AD以高亮表示。 C, G A, B, E, F D
下一个顶点为距离DA最近的顶点。BD为9,距A为7,E为15,F为6。因此,FDA最近,因此将顶点F与相应边DF以高亮表示。 C, G B, E, F A, D
算法继续重复上面的步骤。距离A为7的顶点B被高亮表示。 C B, E, G A, D, F
在当前情况下,可以在CEG间进行选择。CB为8,EB为7,GF为11。E最近,因此将顶点E与相应边BE高亮表示。 C, E, G A, D, F, B
这里,可供选择的顶点只有CGCE为5,GE为9,故选取C,并与边EC一同高亮表示。 C, G A, D, F, B, E
顶点G是唯一剩下的顶点,它距F为11,距E为9,E最近,故高亮表示G及相应边EG G A, D, F, B, E, C

prim算法java版的更多相关文章

  1. 排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

    常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...

  2. 加权无向图 最小生成树 Prim算法 延迟版和即时版 村里修路该先修哪

    本次要解决的问题是:你们村里那些坑坑洼洼的路,到底哪些路才是主干道? 小明:肯定是哪里都能到得了,并且去哪里都相对比较近,并且被大家共用程度高的路是啊! 具体是哪几条路呢?今天就可以给出准确答案 最小 ...

  3. 排序算法系列:插入排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 和选择排序类似的是也分成“已排序”部分,和“未排 ...

  4. 排序算法系列:选择排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 从数组头元素索引i开始,寻找后面最小的值(比i位 ...

  5. 排序算法系列:快速排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https: ...

  6. 常用排序算法--java版

    package com.whw.sortPractice; import java.util.Arrays; public class Sort { /** * 遍历一个数组 * @param sor ...

  7. Kruskal算法java版

    /** * sample Kruskal.java Description: * kruskal算法的思想是找最小边,且每次找到的边不会和以找出来的边形成环路,利用一个一维数组group存放当前顶点所 ...

  8. 快速排序算法Java版

    网上关于快速排序的算法原理和算法实现都比较多,不过java是实现并不多,而且部分实现很难理解,和思路有点不搭调.所以整理了这篇文章.如果有不妥之处还请建议.首先先复习一些基础.    1.算法概念. ...

  9. 爬山算法 | Java版HA_TSP

    嗯哼,今天记录下采用Java编写的爬山算法(Hill Algorithm)求解TSP问题. 爬山算法与其他智能算法类似,是一种用来求解多峰函数最值的算法,爬山算法的基本思想是新解不劣于当前解则转移,否 ...

随机推荐

  1. C#结合LumiSoft.Net.dll读取Outlook邮件(.eml格式邮件)

    如果直接从Outlook(或者微软的其它邮件客户端如:Outlook Express.Windows Live Mail)的邮件文件(.eml格式)中提取各种电子邮件内容,使用LumiSoft.Net ...

  2. 作业一:创建个人技术博客、自我介绍、简单的C程序

    年9月14日中午12点: 一.主要内容  建个人技术博客(博客园 www.cnblogs.com) 本学期将通过写博客的方式提交作业,实际上,最终的目的是希望同学们能通过博客的形式记录我们整个学习过程 ...

  3. 学习WPF——WPF布局——初识布局容器

    StackPanel堆叠布局 StackPanel是简单布局方式之一,可以很方便的进行纵向布局和横向布局 StackPanel默认是纵向布局的 <Window x:Class="Wpf ...

  4. unity3D——自带寻路Navmesh入门教程(二)(转)

    转自:http://liweizhaolili.blog.163.com/blog/static/16230744201271210237616/ 上一节简单介绍了NavMesh寻路的基本用法,这次来 ...

  5. [stm32] 中断

    #include "stm32f10x.h" #include "stm32f10x_tim.h" #include "misc.h" #i ...

  6. Visual Studio 发布新版API智能提示

    Visual Studio 新版API智能提示两周前发布.有了它,你可以在调用API的同时,方便了解到API的相关示例代码.这大大地有助于开发人员学习和使用API. 安装方法如下: 1. 打开Visu ...

  7. 如何带领一个Android开发团队

    1)重构,夜未眠 将框架从业务中剥离 如何提高开发效率 如何提高程序性能 单元测试 技术调研 代码版本管理 2)渠道包管理 自动打包工具 批量打渠道包的两种解决方案 定制渠道包的流程管理 3)稳定性, ...

  8. 浅谈压缩感知(二十九):压缩感知算法之迭代硬阈值(IHT)

    主要内容: 1.IHT的算法流程 2.IHT的MATLAB实现 3.二维信号的实验与结果 4.加速的IHT算法实验与结果 一.IHT的算法流程 文献:T. Blumensath and M. Davi ...

  9. Atitit.计算机图形图像图片处理原理与概论attilax总结

    Atitit.计算机图形图像图片处理原理与概论attilax总结 计算机图形1 图像处理.分析与机器视觉(第3版)1 数字图像处理(第六版)2 图像处理基础(第2版)2 发展沿革 1963年,伊凡·苏 ...

  10. atitit.web的动态include 跟变量传递 java .net php

    atitit.web的动态include 跟变量传递 java .net php 1. 动态include  <jsp:include 1 2. 使用QueryString 1 3. 使用Ses ...