浅谈最小生成树的算法思路(一)Prim算法
生活随笔
收集整理的這篇文章主要介紹了
浅谈最小生成树的算法思路(一)Prim算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Prim算法是求最小生成樹的一種常見算法,簡單談一下筆者自己的理解。
算法思路
代碼思路
例如lowcost[3]=m,3表示下標為3的點,當m為0表示該點已經在集合P中,即已經確定;當m為65535,表示該點與集合P暫時沒有直接路徑可到達;其他值表示該點與P可以直接通過一條連線到達,并且當前最短距離為m。
需要說明的是,這個數組是會不斷變化的,最初,當P中只有一個點A的時候,lowcost表示A到各點的距離,這個時候有些點與點A沒有直達路徑,此時這些點是為65535的;而程序結束時,該數組的元素的值將都為0,因為所有點已經都添加到P了,此時各點到P的距離都為0。
例如lowcost[3]=m,mst[3]=2表示下標為3的點A到P的距離為m,該連線是A與P中下標為2的點B的連線。
例如,此時P中有3個點{A,B,C},Q中有2個點{D,E},C為剛剛添加的點。由于我們剛剛將C添加到P,所以執行步驟7之前的lostcost數組中保存著{A,B}到{C,D,E}的最短距離,比如lostcost為[0,0,0,Sd,Se]。當C添加進去之后,有可能之前AB到DE都距離比較遠或者沒有直接路徑,而C到DE的距離很近,這個時候就需要比較C到DE的距離Scd和Sce有沒有比Sd,Se更小,如果有則更新lostcost中的Sd,Se為一個新的值。
代碼實現(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;//初始化數組,即將點A添加到P中,計算與各點的距離for (i = 1; i < n; i++) {lowcost[i] = graph[0][i];mst[i] = 0;}//i為已經確定的點數,由于點A已經確定,故初始化為1for (i = 1; i < n; i++) {min = MAX;minid = 0;//找到P到Q的最短路徑,將點添加到Pfor (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;//如果新添加到P的點minid帶來了與Q中剩余點的更短路徑,更新lowcost、mst數組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);} }總結
以上是生活随笔為你收集整理的浅谈最小生成树的算法思路(一)Prim算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JDK的快速排序算法实现DualPivo
- 下一篇: 浅谈最小生成树的算法思路(二)Krusk