博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
prim算法java版
阅读量:5282 次
发布时间:2019-06-14

本文共 2685 字,大约阅读时间需要 8 分钟。

public class Prim {        static int MAX = 65535;       public static void prim(int[][] graph, int n){                char[] c = new char[]{'A','B','C','D','E','F','G','E','F'};                int[] lowcost = new int[n];               int[] mst = new int[n];        int i, j, min, minid, sum = 0;                for(i = 1; i < n; i++){            lowcost[i] = graph[0][i];            mst[i] = 0;                    }                for(i = 1; i < n; i++){                        min = MAX;            minid = 0;            for(j = 1; j < n; j++){                if (lowcost[j] < min && lowcost[j] != 0) {                    min = lowcost[j];                    minid = j;                }            }            System.out.println(c[mst[minid]] + "到" + c[minid] + " 权值:" + min);                        sum += min;            lowcost[minid] = 0;                                    for (j = 1; j < n; j++) {                    if (graph[minid][j] < lowcost[j]) {                    lowcost[j] = graph[minid][j];                    mst[j] = minid;                }            }        }                System.out.println("sum:" + sum);            }        public static void main(String[] args) {                int[][] map = new int[][]{                {
0,10,MAX,MAX,MAX,11,MAX,MAX,MAX}, {
10,0,18,MAX,MAX,MAX,16,MAX,12}, {MAX,MAX,0,22,MAX,MAX,MAX,MAX,8}, {MAX,MAX,22,0,20,MAX,MAX,16,21}, {MAX,MAX,MAX,20,0,26,MAX,7,MAX}, {
11,MAX,MAX,MAX,26,0,17,MAX,MAX}, {MAX,16,MAX,MAX,MAX,17,0,19,MAX}, {MAX,MAX,MAX,16,7,MAX,19,0,MAX}, {MAX,12,8,21,MAX,MAX,MAX,MAX,0} }; prim(map, map.length); }}

 

 

输出结果:

A到B 权值:10A到F 权值:11B到F 权值:12F到C 权值:8B到G 权值:16G到E 权值:19E到E 权值:7E到D 权值:16sum:99
 
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

 

posted on
2013-07-17 18:25 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/yesun/p/3196398.html

你可能感兴趣的文章
HDU 1501 Zipper
查看>>
打包java程序生成exe
查看>>
八叉树
查看>>
poj 1129 搜索
查看>>
Git 远程仓库
查看>>
HttpClient的巨坑
查看>>
关于静态文本框透明度的问题
查看>>
海量数据、高并发的优化方案
查看>>
javascript的发展及个人笔记
查看>>
全选,反全选,反选,获取选中的值,根据子选择控制全选按钮
查看>>
梦断代码读后感01
查看>>
[CF#250 Div.2 D]The Child and Zoo(并查集)
查看>>
博客园博客插入公式
查看>>
hdu 1028 Ignatius and the Princess III(母函数入门+模板)
查看>>
Ubuntu下配置安装telnet server
查看>>
Codeforces 235 E Number Challenge
查看>>
ubuntu 常见命令整理
查看>>
EJBCA安装教程+postgresql+wildfly10
查看>>
(五十四)涂鸦的实现和截图的保存
查看>>
配置EditPlus使其可以编译运行java程序
查看>>