日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

普里姆算法(修路问题)+图解

發(fā)布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 普里姆算法(修路问题)+图解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

圖解



代碼實現(xiàn)

package com.atguigu.prim;import java.util.Arrays;/*** @創(chuàng)建人 wdl* @創(chuàng)建時間 2021/4/5* @描述*/ public class PrimAlgorithm {public static void main(String[] args) {//測試看看圖是否創(chuàng)建OKchar[] data = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};int verxs = data.length;//鄰接矩陣用二維數(shù)組表示,10000這個大數(shù)表示這兩個點不連通int [][]weight=new int[][]{{10000,5,7,10000,10000,10000,2},{5,10000,10000,9,10000,10000,3},{7,10000,10000,10000,8,10000,10000},{10000,9,10000,10000,10000,4,10000},{10000,10000,8,10000,10000,5,4},{10000,10000,10000,4,5,10000,6},{2,3,10000,10000,4,6,10000}};//創(chuàng)建MGraph對象MGraph graph = new MGraph(verxs);//創(chuàng)建一個MinTree對象MinTree minTree = new MinTree();minTree.createGraph(graph,verxs,data,weight);//輸出minTree.showGraph(graph);//測試普里姆算法minTree.prim(graph,0);}}//創(chuàng)建最小生成樹->村莊的圖 class MinTree{//創(chuàng)建圖的鄰接矩陣/**** @param graph 圖對象* @param verxs 圖對應(yīng)的頂點個數(shù)* @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 表示從圖的第幾個頂點開始生成'A'->0 'B'->1....*/public void prim(MGraph graph,int v){//visited[]標(biāo)記節(jié)點是否被訪問過int[] visited = new int[graph.verxs];//visited[] 默認(rèn)元素的值都是0,表示沒有訪問過 // for (int i = 0; i < graph.verxs; i++) { // visited[i]=0; // }//把當(dāng)前這個節(jié)點標(biāo)記為已訪問visited[v]=1;//h1和h2記錄兩個頂點的下標(biāo)int h1=-1;int h2=-1;int minWeight=10000;//將minWeight初始成一個大數(shù),后面遍歷過程中,會被替換for (int k = 1; k < graph.verxs; k++) {//因為有g(shù)raph.verxs個頂點,普里姆算法結(jié)束后,有g(shù)raph.verxs-1邊//這個確定每一次生成的子圖,和哪個節(jié)點的距離最近for (int i = 0; i < graph.verxs; i++) {//i節(jié)點表示被訪問過的節(jié)點for (int j = 0; j < graph.verxs; j++) {//j節(jié)點表示環(huán)沒有訪問過的節(jié)點if(visited[i]==1&&visited[j]==0&&graph.weight[i][j]<minWeight){//替換minWeight(尋找已經(jīng)訪問過的節(jié)點和未訪問過的節(jié)點間的權(quán)值最小的邊)minWeight = graph.weight[i][j];h1=i;h2=j;}}}//找到一條邊是最小System.out.println("邊<"+graph.data[h1]+","+graph.data[h2]+">權(quán)值:"+minWeight);//將當(dāng)前這個節(jié)點標(biāo)記為已經(jīng)訪問visited[h2]=1;//minWeight重新設(shè)置為一個最大值10000minWeight=10000;}}}class MGraph{int verxs;//表示圖的節(jié)點個數(shù)char[] data;//存放結(jié)點的數(shù)據(jù)int [][] weight;//存放邊,就是我們的鄰接矩陣public MGraph(int verxs){this.verxs=verxs;data=new char[verxs];weight=new int[verxs][verxs];}}

總結(jié)

以上是生活随笔為你收集整理的普里姆算法(修路问题)+图解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。