• 最小生成树的prim算法


    代码1:

    转自:http://blog.csdn.net/jlhnxly/article/details/6402020

     1 /**
    2 * 最小生成树的prim算法
    3 * @author liuy
    4 */
    5 public class Prim {
    6
    7 public static void prim(int num, float[][] weight) { //num为顶点数,weight为权
    8 float[] lowcost = new float[num + 1]; //到新集合的最小权
    9
    10 int[] closest = new int[num + 1]; //代表与s集合相连的最小权边的点
    11
    12 boolean[] s = new boolean[num + 1]; //s[i] == true代表i点在s集合中
    13
    14 s[1] = true; //将第一个点放入s集合
    15
    16 for(int i = 2; i <= num; i++) { //初始化辅助数组
    17 lowcost[i] = weight[1][i];
    18 closest[i] = 1;
    19 s[i] = false;
    20 }
    21
    22 for(int i = 1; i < num; i++) {
    23 float min = Float.MAX_VALUE;
    24 int j = 1;
    25 for(int k = 2; k <= num; k++) {
    26 if((lowcost[k] < min) && (!s[k])) {//根据最小权加入新点
    27 min = lowcost[k];
    28 j = k;
    29 }
    30 }
    31
    32 System.out.println("加入点" + j + ". " + j + "---" + closest[j]);//新加入点的j和与j相连的点
    33
    34 s[j] = true;//加入新点j
    35
    36 for(int k = 2; k <= num; k++) {
    37 if((weight[j][k] < lowcost[k]) && !s[k]) {//根据新加入的点j,求得最小权
    38 lowcost[k] = weight[j][k];
    39 closest[k] = j;
    40 }
    41 }
    42 }
    43 }
    44
    45 public static void main(String[] args) {
    46 //
    47 // / | /
    48 // 6 1 5
    49 // / | /
    50 // ②-5--③--5--④
    51 // / // /
    52 // 3 6 4 2
    53 //////
    54 // ⑤--6-⑥
    55 //最小生成树为:
    56 //
    57 // |
    58 // 1
    59 // |
    60 // ②-5--③ ④
    61 // / / /
    62 // 3 4 2
    63 // / //
    64 // ⑤ ⑥
    65 //
    66 float m = Float.MAX_VALUE;
    67 float[][] weight = {{0, 0, 0, 0, 0, 0, 0},
    68 {0, m, 6, 1, 5, m, m},
    69 {0, 6, m, 5, m, 3, m},
    70 {0, 1, 5, m, 5, 6, 4},
    71 {0, 5, m, 5, m, m, 2},
    72 {0, m, 3, 6, m, m, 6},
    73 {0, m, m, 4, 2, 6, m}};//上图的矩阵
    74 prim(weight.length - 1, weight);
    75 //加入点3. 3---1
    76 //加入点6. 6---3
    77 //加入点4. 4---6
    78 //加入点2. 2---3
    79 //加入点5. 5---2
    80 }
    81 }


    代码2:

    View Code
     1 public class MST {
    2
    3 public MST() {
    4 }
    5
    6 /** The adjacency matrix of the graph */
    7 private double[][] adjM;
    8
    9 public double[][] buildMST(double[][] adjM) {
    10
    11 this.adjM = adjM;
    12
    13 // Marks nodes that belong to MST. Initial MST has only one node.
    14 boolean[] allV = new boolean[adjM.length];
    15 allV[0] = true;
    16
    17 // Adjacency matrix defining MST
    18 double[][] mst = new double[adjM.length][adjM.length];
    19 for(int i = 0, n = mst.length; i < n; i++) {
    20 for(int j = 0; j < n; j++) {
    21 /*
    22 * Using -1 to indicate that there is no edge between nodes i and j.
    23 * Can't use 0 because it is a valid distance.
    24 */
    25 mst[i][j] = -1;
    26 }
    27 }
    28
    29 Edge e = null;
    30 while((e = findMinimumEdge(allV)) != null ) {
    31 allV[e.getJ()] = true;
    32 mst[e.getI()][e.getJ()] = e.getW();
    33 mst[e.getJ()][e.getI()] = e.getW();
    34 }
    35
    36 return mst;
    37 }
    38
    39 private Edge findMinimumEdge(boolean[] mstV) {
    40 Edge e = null;
    41 double minW = Double.POSITIVE_INFINITY;
    42 int minI = -1;
    43 int minJ = -1;
    44
    45 for( int i = 0, n = adjM.length; i < n; i++ ) {
    46 // part of MST
    47 if( mstV[i] == true ) {
    48 for(int j = 0, k = adjM.length; j < k; j++) {
    49 // not part of MST
    50 if( mstV[j] == false ) {
    51 if( minW > adjM[i][j]) {
    52 minW = adjM[i][j];
    53 minI = i;
    54 minJ = j;
    55 }
    56 }
    57 }
    58 }
    59 }
    60
    61 if( minI > -1 ) {
    62 e = new Edge(minI, minJ, minW);
    63 }
    64
    65 return e;
    66 }
    67
    68 class Edge {
    69
    70 private int i;
    71 private int j;
    72 private double w;
    73
    74 Edge(int i, int j, double w) {
    75 this.i = i;
    76 this.j = j;
    77 this.w = w;
    78 }
    79
    80 public int getI() {
    81 return i;
    82 }
    83
    84 public int getJ() {
    85 return j;
    86 }
    87
    88 public double getW() {
    89 return w;
    90 }
    91
    92 }
    93 }



  • 相关阅读:
    CodeForces-1100C NN and the Optical Illusion 简单数学
    HDU-3038 How Many Answers Are Wrong 并查集
    POJ-1321 棋盘问题 DFS
    POJ-1651 Multiplication Puzzle 区间DP
    HDU-2037 今年暑假不AC 贪心
    排序算法的总结
    UVa-679 Dropping Balls 二叉树
    Coursera机器学习——Recommender System测验
    页面置换算法及例题
    这篇最新MySQL面试题请查收
  • 原文地址:https://www.cnblogs.com/paulbai/p/prim.html
Copyright © 2020-2023  润新知