• 最小生成树算法


    什么是最小生成树?

    对于无向图G=(V, E),V表示图中的结点,E表示图中的边,所谓最小生成树就是联通图G中所有结点所需要的边长度总和最小,这些边加上V就构成图G的一颗最小生成树。这样还不清楚我们可以举个例子:有n个城市分布在不同的地方,为了保证每个城市间都能用火车通行,我们需要在城市之间修铁路,但是为了节约成本,我们在保证每两个城市之间都能联通的情况下要使得所修的铁路长度最短。这就是一个最小生成树的问题。

    Prim算法和Kruskal算法------http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html

    最小生成树:Prim算法代码详解

    import java.util.*;
    public class Prim {
        static int MAX = Integer.MAX_VALUE;
    
        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);
        }
         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[] mid= new int[n];//存取前驱结点
                List<Character> list=new ArrayList<Character>();//用来存储加入结点的顺序
                int i, j, min, minid , sum = 0;
                //初始化辅助数组
                for(i=1;i<n;i++)
                {
                    lowcost[i]=graph[0][i];
                    mid[i]=0;
                }
                list.add(c[0]);
                //一共需要加入n-1个点
                for(i=1;i<n;i++)
                {
                     min=MAX;
                     minid=0;
                     //每次找到距离集合最近的点
                     for(j=1;j<n;j++)
                     {
                         if(lowcost[j]!=0&&lowcost[j]<min)
                         {
                             min=lowcost[j];
                             minid=j;
                         }
                     }
                     
                     if(minid==0) return;
                     list.add(c[minid]);
                     lowcost[minid]=0;
                     sum+=min;
                     System.out.println(c[mid[minid]] + "到" + c[minid] + " 权值:" + min);
                     //加入该点后,更新其它点到集合的距离
                     for(j=1;j<n;j++)
                     {
                         if(lowcost[j]!=0&&lowcost[j]>graph[minid][j])
                         {
                             lowcost[j]=graph[minid][j];
                             mid[j]=minid;
                         }
                     }
                }
                System.out.println("sum:" + sum);
                
            }
            
    }

     算法练习题:

    http://acm.hdu.edu.cn/showproblem.php?pid=2682

    ps:求解素数

    http://blog.csdn.net/liukehua123/article/details/5482854

  • 相关阅读:
    将Python 程序打包成 .exe格式入门
    浅论各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别
    用pyinstaller打包python程序,解决打包时的错误:Cannot find existing PyQt5 plugin directories
    win10下 anaconda 环境下python2和python3版本转换
    zsh: command not found: conda的一种解决方法
    mac-os安装autojump
    六环外的商业
    浮躁的社会没错,错的是缺少一颗平静的心
    一张图看懂STM32芯片型号的命名规则
    OpenOCD的概念,安装和使用
  • 原文地址:https://www.cnblogs.com/lchzls/p/7337488.html
Copyright © 2020-2023  润新知