prim算法java版

public class Prim {
    
    static int MAX = 65535;   
    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[] mst = new int[n];
        int i, j, min, minid, sum = 0;
        
        for(i = 1; i < n; i++){
            lowcost[i] = graph[0][i];
            mst[i] = 0;            
        }
        
        for(i = 1; i < n; i++){
            
            min = MAX;
            minid = 0;
            for(j = 1; j < n; j++){
                if (lowcost[j] < min && lowcost[j] != 0) {
                    min = lowcost[j];
                    minid = j;
                }
            }
            System.out.println(c[mst[minid]] + "到" + c[minid] + " 權值:" + min);
            
            sum += min;
            lowcost[minid] = 0;
                        
            for (j = 1; j < n; j++) {    
                if (graph[minid][j] < lowcost[j]) {
                    lowcost[j] = graph[minid][j];
                    mst[j] = minid;
                }
            }
        }
        
        System.out.println("sum:" + sum);
        
    }
    

    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);
    }

}

 

 

輸出結果:web

A到B 權值:10
A到F 權值:11
B到F 權值:12
F到C 權值:8
B到G 權值:16
G到E 權值:19
E到E 權值:7
E到D 權值:16
sum:99
 
prim算法的思想:
  • 初始化時,v0加入到最小樹,其餘全部頂點做爲未加入樹的集合
  • 取矩陣中第一橫,lowcost[],其實就是v0與其餘頂點的距離,找出最小的,好比v4,v4加入到最小樹,此時最小數有兩個節點了v0和v4
  • 接下來,要找到其餘未加入樹頂點中與最小樹頂點距離最近的那個點
    • lowcost[]這是v0的數據
    • 找到v4與其餘頂點的距離數據,即矩陣的第5橫 tmp[]
    • 而後rmp[]和lowcost[]縱向對比大小,小的數據設置到lowcost[]
    • 而後橫向對比lowcost[]數據,找到最小點X,這個X即爲與最小樹距離最近的那個點
  • 同理,依次將全部頂點加入到最小樹

 

WIKI解釋算法

圖例 說明 不可選 可選 已選
Prim Algorithm 0.svg 此爲原始的加權連通圖。每條邊一側的數字表明其權值。 - - -
Prim Algorithm 1.svg 頂點D被任意選爲起始點。頂點ABEF經過單條邊與D相連。A是距離D最近的頂點,所以將A及對應邊AD以高亮表示。 C, G A, B, E, F D
Prim Algorithm 2.svg 下一個頂點爲距離DA最近的頂點。BD爲9,距A爲7,E爲15,F爲6。所以,FDA最近,所以將頂點F與相應邊DF以高亮表示。 C, G B, E, F A, D
Prim Algorithm 3.svg 算法繼續重複上面的步驟。距離A爲7的頂點B被高亮表示。 C B, E, G A, D, F
Prim Algorithm 4.svg 在當前狀況下,能夠在CEG間進行選擇。CB爲8,EB爲7,GF爲11。E最近,所以將頂點E與相應邊BE高亮表示。 C, E, G A, D, F, B
Prim Algorithm 5.svg 這裏,可供選擇的頂點只有CGCE爲5,GE爲9,故選取C,並與邊EC一同高亮表示。 C, G A, D, F, B, E
Prim Algorithm 6.svg 頂點G是惟一剩下的頂點,它距F爲11,距E爲9,E最近,故高亮表示G及相應邊EG G A, D, F, B, E, C
Prim Algorithm 7.svg
相關文章
相關標籤/搜索