最小生成樹(Prim算法)


Java實現Prim算法

 1 package com.java;
 2 import java.util.*;
 3 
 4 /**
 5  * 普里姆算法—Prim算法
 6  * 算法思路:將圖中所有的頂點分為兩類:樹頂點(已被選入生成樹的頂點)和非樹頂點(還未被選入生成樹的頂點)。
 7  * 1)首先選擇任意一個頂點加入生成樹;
 8  * 2)接下來要找出一條邊添加到生成樹,這需要枚舉每一個樹頂點到每一個非樹頂點所有的邊,然后找到最短邊加入到生成樹;
 9  * 3)按照此方法重復n-1次,直到將所有頂點都加入到生成樹中。
10  */
11 
12 public class Prim {
13     static int MAX = Integer.MAX_VALUE;
14 
15     public static void main(String[] args) {
16         int[][] map = new int[][] {
17                 { 0, 2, 14, 1},
18                 { 2, 0, 5, MAX},
19                 { 14, 5, 0, 8},
20                 { 1, MAX, 8, 0}};
21         prim(map, map.length);
22     }
23     public static void prim(int[][] graph, int n){
24 
25         char[] c = new char[]{'A','B','C','D'};
26         int[] lowcost = new int[n];  //到新集合的最小權
27         int[] mid= new int[n];//存取前驅結點的下標
28         List<Character> list=new ArrayList<Character>();//用來存儲加入到生成樹結點
29         int i, j, min, minid , sum = 0;
30         //初始化輔助數組
31         for(i=1;i<n;i++)
32         {
33             lowcost[i]=graph[0][i];
34             mid[i]=0;
35         }
36         //加入第一個根節點
37         list.add(c[0]);
38         //加入其他的n-1個節點
39         for(i=1;i<n;i++)
40         {
41             min=MAX;
42             minid=0;
43             //每次找到距離集合最近的點
44             for(j=1;j<n;j++)
45             {
46                 if(lowcost[j]!=0&&lowcost[j]<min)
47                 {
48                     min=lowcost[j];
49                     minid=j;
50                 }
51             }
52             if(minid==0) return;
53             //將找到的最小值的節點加入到生成樹
54             list.add(c[minid]);
55             //加入生成樹后的節點值設為0
56             lowcost[minid]=0;
57             sum+=min;
58             System.out.println(c[mid[minid]] + "到" + c[minid] + " 權值:" + min);
59             //加入該點后,更新其它點到集合的距離
60             for(j=1;j<n;j++)
61             {
62                 if(lowcost[j]!=0&&lowcost[j]>graph[minid][j])
63                 {
64                     lowcost[j]=graph[minid][j];
65                     mid[j]=minid;
66                 }
67             }
68         }
69         System.out.println("最小生成樹的權值為sum=" + sum);
70 
71     }
72 }

 


免責聲明!

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



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