普里姆(Prim)算法 Java实现

原创 2017年02月21日 09:13:41

个人认为此算法遍历顺序的决定条件:

1.确定第一个顶点

2.下一个顶点可到(小于正无穷)

3.取可到顶点中最小权值的一个


代码中的图


最小生成树:99



代码(参考其他文章):

public class MinSpanTree {
    /** 邻接矩阵*/
    int[][] matrix;
    /** 表示正无穷*/
    int MAX_WEIGHT = Integer.MAX_VALUE;
    /** 顶点个数*/
    int size;

    /**
     * 普里姆算法实现最小生成树:先初始化拿到第一个顶点相关联的权值元素放到数组中-》找到其中权值最小的顶点下标-》再根据该下标,将该下标顶点相关联的权值加入到数组中-》循环遍历处理
     */
    public void prim() {
        /**存放当前到全部顶点最小权值的数组,如果已经遍历过的顶点权值为0,无法到达的为正无穷*/
        int[] tempWeight = new int[size];
        /**当前到下一个最小权值顶点的最小权值*/
        int minWeight;
        /**当前到下一个最小权值的顶点*/
        int minId;
        /**权值总和*/
        int sum = 0;
        
        //第一个顶点时,到其他顶点的权值即为邻接矩阵的第一行
        for (int i = 0; i < size; i++) {
            tempWeight[i] = matrix[0][i];
        }

        System.out.println("从顶点v0开始查找");
        for (int i = 1; i < size; i++) {
            // 每次循环找出当前到下一个最小权值的顶点极其最小权值 
            minWeight = MAX_WEIGHT;
            minId = 0;
            for (int j = 1; j < size; j++) {
                //权值为0的顶点已经遍历过,不再计入
                if (tempWeight[j] > 0 && tempWeight[j] < minWeight) {
                    minWeight = tempWeight[j];
                    minId = j;
                }
            }
            
            // 找到目标顶点minId,他的权值为minweight。
            System.out.println("找到顶点:v" + minId + " 权值为:" + minWeight);
            sum += minWeight;
            
            
            // 算法核心所在:将目标顶点到各个顶点的权值与当前tempWeight数组中的权值做比较,如果前者比后者到某个顶点的权值更小,将前者到这个顶点的权值更新入后者。
            tempWeight[minId] = 0;
            for (int j = 1; j < size; j++) {
                if (tempWeight[j] != 0 && matrix[minId][j] < tempWeight[j]) {
                    tempWeight[j] = matrix[minId][j];
                }
            }
        }
        System.out.println("最小权值总和为:" + sum);
    }

    private void createGraph(int index) {
        size = index;
        matrix = new int[index][index];
        int[] v0 = { 0, 10, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 11, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT };
        int[] v1 = { 10, 0, 18, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 16, MAX_WEIGHT, 12 };
        int[] v2 = { MAX_WEIGHT, 18, 0, 22, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 8 };
        int[] v3 = { MAX_WEIGHT, MAX_WEIGHT, 22, 0, 20, MAX_WEIGHT, MAX_WEIGHT, 16, 21 };
        int[] v4 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 20, 0, 26, MAX_WEIGHT, 7, MAX_WEIGHT };
        int[] v5 = { 11, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 26, 0, 17, MAX_WEIGHT, MAX_WEIGHT };
        int[] v6 = { MAX_WEIGHT, 16, MAX_WEIGHT, 24, MAX_WEIGHT, 17, 0, 19, MAX_WEIGHT };
        int[] v7 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 16, 7, MAX_WEIGHT, 19, 0, MAX_WEIGHT };
        int[] v8 = { MAX_WEIGHT, 12, 8, 21, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 0 };
        matrix[0] = v0;
        matrix[1] = v1;
        matrix[2] = v2;
        matrix[3] = v3;
        matrix[4] = v4;
        matrix[5] = v5;
        matrix[6] = v6;
        matrix[7] = v7;
        matrix[8] = v8;
    }

    public static void main(String[] args) {
        MinSpanTree graph = new MinSpanTree();
        graph.createGraph(9);
        graph.prim();
    }

}


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CmdSmith/article/details/56274314

java算法

-
  • 1970年01月01日 08:00

普利姆(prim)算法和克鲁斯卡尔(kruskal)算法

连通网的最小生成树算法: 1.普里姆算法——”加点法”。 假设N=(V,{E})是连通网,TE为最小生成树的边集合。 (1)初始U={u0}(u0∈V),TE=φ; (2)在所有u∈U,...
  • Solo95
  • Solo95
  • 2016-05-18 17:36:53
  • 1371

最小生成树之克鲁斯卡尔(Kruskal)算法、普里姆(prim)算法

问题描述:                   在一个具有几个顶点的连通图G中,如果存在子图G'包含G中所有顶点和一部分边,且不形成回路,则称G'为图G的生成树,其中代价最小的生成树则称为最小生成树...
  • Candy1232009
  • Candy1232009
  • 2012-01-04 11:09:32
  • 6783

Prim(普利姆)算法+Kruskal(克鲁斯卡尔)算法

Prim(普利姆)算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:...
  • oenheng
  • oenheng
  • 2016-08-19 16:11:14
  • 693

普里姆(Prim)算法,数据机构,c语言,严蔚敏

  • 2009年12月31日 19:09
  • 2KB
  • 下载

最小生成树(MST)----普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法

1、概念:给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树. 2、应用:例如:要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信...
  • mapeng892020
  • mapeng892020
  • 2015-03-10 10:49:33
  • 833

最小生成树——Prim(普利姆)算法

【0】README0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解Prim算法的idea 并用 源代码加以实现;【1】Prim算法相关1.1)计算最小生成树的一种方法是使其连续...
  • PacosonSWJTU
  • PacosonSWJTU
  • 2015-11-20 15:21:57
  • 514

最小生成树之Prim(普里姆)算法

最小生成树之Prim(普里姆)算法
  • u012965373
  • u012965373
  • 2015-08-11 15:18:03
  • 1414

最小生成树(Prim算法)

最小生成树是一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 最小生成树其实是最小权重生成树的简称。其一般应用于无向图。求最小生成树...
  • chenhuajie123
  • chenhuajie123
  • 2013-09-13 16:25:46
  • 1576

最小生成树普利姆算法c语言实现__Prim

为方便,本程序中所用图结点及边在main函数中直接定义 #include #include #define MAXVEX 5 #define INFINITY 65535 // 权值为6...
  • ppalive_
  • ppalive_
  • 2015-08-17 22:27:49
  • 1857
收藏助手
不良信息举报
您举报文章:普里姆(Prim)算法 Java实现
举报原因:
原因补充:

(最多只允许输入30个字)