算法 - 普里姆算法(修路问题求解)
生活随笔
收集整理的這篇文章主要介紹了
算法 - 普里姆算法(修路问题求解)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
從A開始,A作為定點,找到與A相連并且未被處理(不在頂點集合中)的進行處理,找到權值最小的并加入集合,A-C[7]、A-G[2]、A-B[5],最小的是A-G[2],所以把G加入集合,這里是有A-G的連接的。
然后把A、G作為頂點,找到與A、G相連未被處理的進行處理,A-C[7]、A-B[5]、G-E[4]、G-B[3]、G-F[6],最小的是G-B[3],把B加入集合,
直到全部遍歷完成!
代碼
package Algorithm.prim;import java.util.Arrays;public class PrimAlgorihm {public static void main(String[] args) {char data [] = new char[]{'A','B','C','D','E','F','G'};int verxs = data.length;int weight [][] = new int[][]{{10000,5,7,10000,10000,10000,2},{5,10000,10000,9,10000,10000,3},{7,10000,10000,10000,8,10000,1},{10000,9,10000,10000,10000,4,1},{10000,10000,8,10000,10000,5,4},{10000,10000,10000,4,5,10000,6},{2,3,10000,10000,4,6,10000},};MGraph mGraph = new MGraph(verxs);MinTree minTree = new MinTree();minTree.createGraph(mGraph,verxs,data,weight);minTree.showGraph(mGraph);//測試普里姆算法minTree.prim(mGraph,6);} }//創建最小生成樹 -> class MinTree{//創建圖的鄰接矩陣/**** @param graph 圖對象* @param verxs 頂點個數* @param data 各個頂點的值* @param weight 圖的鄰接矩陣*/public void createGraph(MGraph graph, int verxs, char [] data, int weight [][]){int i,j;for (i = 0; i < verxs; i++) {graph.data[i] = data[i];for (j = 0; j < verxs; j++){graph.weight[i][j] = weight[i][j];}}}//顯示圖的鄰接矩陣public void showGraph(MGraph graph){for (int [] link : graph.weight){System.out.println(Arrays.toString(link));}}//編寫prim算法,得到最小生成樹/**** @param graph 圖* @param v 從圖的哪個頂點開始生產*/public void prim(MGraph graph, int v){//visited[] 標記頂點是否被訪問過,默認都為0int visited [] = new int[graph.verxs];//把當前節點標記為以訪問visited[v] = 1;//用h1和h2記錄兩個頂點的下標int h1 = -1;int h2 = -1;int minWeight = 10000;//將minWeight先初始化為一個大數,后面遍歷過程中會被替換for (int k = 0; k < graph.verxs -1; k++) {//因為有graph.verxs頂點,普里姆算法結束后,有graph.verxs-1邊//這個是確定每一次生成的子圖,和哪個節點的距離最近//就是把所有的節點都給遍歷了,所有的線都遍歷一遍,找到與當前頂點相連的未被訪問過的for (int i = 0; i < graph.verxs; i++) {//i節點表示被訪問過的節點for (int j = 0; j < graph.verxs; j++) {//j節點表示未被訪問過的節點if (visited[i] == 1 && visited[j] == 0 && graph.weight[i][j] < minWeight){//替換minWeight(尋找已經訪問過的節點和未訪問過的節點之間的權值最小的)minWeight = graph.weight[i][j];h1 = i;h2 = j;}}}//找到一條邊是最小的System.out.println("邊 <" + graph.data[h1]+","+graph.data[h2]+"> 權值:" + minWeight);//把當前節點標記為已經訪問過visited[h2] = 1;//重置minWeightminWeight = 10000;}} } class MGraph{int verxs; //圖的節點個數char[] data;//保存節點數據int[][] weight;//存放邊,鄰接矩陣public MGraph(int verxs) {this.verxs = verxs;data = new char[verxs];weight = new int[verxs][verxs];}}總結
以上是生活随笔為你收集整理的算法 - 普里姆算法(修路问题求解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 业界首个!中国移动发布6G网络总体架构设
- 下一篇: 《鬼吹灯》改编剧《昆仑神宫》新预告:潘粤