• 最小生成树算法


    什么是最小生成树?

    对于无向图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

  • 相关阅读:
    Jmeter(十三)用Jmeter自带录制工具代理录制手机端应用脚本APP脚本
    AppScan 扫描测试策略
    AppScan 工作原理
    AppScan扫描结果分析及工具栏使用
    Java学习之正则表达式
    Java学习之反射练习
    Java学习之反射
    Java学习之网络编程(TCP协议实例)
    Java学习之网络编程(UDP协议实例)
    Java学习之IO(编码练习--截取字符串根据字节)
  • 原文地址:https://www.cnblogs.com/lchzls/p/7337488.html
Copyright © 2020-2023  润新知