码迷,mamicode.com
首页 > 编程语言 > 详细

最小生成树之普里姆算法

时间:2020-08-26 18:50:11      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:das   private   code   ring   system   ini   color   site   个数   

最小生成树

最小生成树(Minimum Cost Spanning Tree),简称MST。

给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树 。

最小生成树的特征:N个顶点,一定有N-1条边;包含全部顶点;N-1条边都在图中。

求最小生成树的算法主要是普里姆 算法和克鲁斯卡尔算法。

算法思路

  1. 指定一个集合S,记录已选择的用来生成最小生成树的结点(代码中通过visited数组的1标记来记录集合S中的元素);
  2. 将起始结点加入集合;
  3. 找到和集合S中任意一顶点距离最近的点(代码中通过双层循环遍历来寻找,通过visited标记来判断非S集合元素,通过权值来判断是否连通、是否最小),加入集合S;
  4. 重复步骤3,直至所有结点都加入集合S,此时这N个结点正好能生成N-1条边。

代码实现

package com.ex.prim;

//无向图中找最短路径:普利姆算法
public class Prim {
    static final int N=10000;
    public static void main(String[] args) {
        //节点数组
        char[] node=new char[]{‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘};
        //权值数组
        int [][]weight=new int[][]{
                {N,5,7,N,N,N,2},
                {5,N,N,9,N,N,3},
                {7,N,N,N,8,N,N},
                {N,9,N,N,N,4,N},
                {N,N,8,N,N,5,4},
                {N,N,N,4,5,N,6},
                {2,3,N,N,4,6,N},};
        //获得最小生成树
        MGraph graph = new MGraph(node.length,node,weight);
        int sum = graph.prim(3);
        System.out.println("路径总长度:"+sum);
    }
}

//无向图
class MGraph{
    //节点个数
    private int count;
    //结点
    private char[] node;
    //边的权值
    private int[][] weight;
    //不可达标记
    static final int N=10000;

    public MGraph(int count, char[] node, int[][] weight) {
        this.count = count;
        this.node = node;
        this.weight = weight;
    }

    /**
     *
     * @param n 从哪个结点开始,n记录该节点在node数组的下标
     * @return
     */
    public int prim(int n){
        //记录访问过的结点
        int[] visited=new int[count];
        //记录路径长度
        int sum=0;
        //从当前结点出发,找到N-1条边将所有结点纳入集合
        visited[n]=1;
        for (int k = 1; k < count; k++) {
            //找到和已访问过的结点距离最近的那条边,将新节点纳入集合,并记录其权值
            int minWeight=N;
            int h1=-1;
            int h2=-1;
            for (int i = 0; i < count; i++) {
                for (int j = 0; j < count; j++) {
                    if (visited[i]==1 && visited[j]==0 && weight[i][j]<minWeight){
                        minWeight=weight[i][j];
                        h1=i;
                        h2=j;
                    }
                }
            }
            //将找到的新顶店纳入集合
            visited[h2]=1;
            sum+=minWeight;
            System.out.println(node[h1]+"—>"+node[h2]+":"+minWeight);
        }
        //算法完成
        return sum;
    }
}

 

最小生成树之普里姆算法

标签:das   private   code   ring   system   ini   color   site   个数   

原文地址:https://www.cnblogs.com/chitangyu/p/13540699.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!