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

}

 

 

輸出結果:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM