日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java带权连通图上最小权边,连通图最小生成树的算法及实现

發布時間:2025/3/15 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java带权连通图上最小权边,连通图最小生成树的算法及实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

連通圖的最小生成樹

生成樹定義:

無向連通圖G的極小連通子圖,稱為它的生成樹。(n個頂點,n-1條邊)

考慮一下下面這個圖

上圖是一個完全圖,它的生成樹不是唯一的,我們列出最特殊的兩種情況

上面2個圖都是第一個完全圖的生成樹,但是2者是完全不同的。

按照深度優先遍歷生成的生成樹,稱為深度優先生成樹

按照廣度優先遍歷生成的生成樹,稱為廣度優先生成樹

非連通圖的生成森林,概念比較簡單,無非就是非連通圖的極大連通子圖和生成樹的概念疊加

最小生成樹

圖G是帶權的無向連通圖,生成樹上個邊權值之和稱為生成樹的代價,代價最小的生成樹稱為最小生成樹。

最小生成樹的生成算法

Prim算法

現有連通圖G=(V, E),其最小連通圖TG=(TV, TE)。

初始狀態下:V = {V0, V1, V2 ... Vn}; TV = {}

從V當中任選一頂點,插入TV,V = {V0, V1, V2 ... Vn}; TV = {V0}

找連接TV和V-TV這兩個集合的權值最小的邊,插入TE,并把該邊2頂點當中原本不屬于TV的頂點加入TV;

重復上一步驟

知道V = TV

下面是java實現,首先我們需要修改一下之前的生成圖的代碼,我們生成了一棵7個頂點的完全圖,每一條邊的權值是100以內的隨機數。

Graph graph = new Graph();

String nodeNames[] = {"aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg"};

for (String s : nodeNames) {

graph.nodes.add(new Node(s));

}

graph.arcs = new int[nodeNames.length][nodeNames.length];

Random ra = new Random();

for (int i = 0; i < graph.nodes.size(); i ++){

for (int j = 0; j < graph.nodes.size(); j ++){

if (i != j){

graph.arcs[i][j] = ra.nextInt(100) + 1;

}

}

}

然后是最小生成樹的Prim算法實現,解釋一下,首先創建一個二維數組表示邊,把空間都分配好,只等著往里面填數就行。然后是一個TreeMap對象,來保存頂點,之所以用TreeMap,是為了保證新圖的頂點順序和原圖是一致的。剩下的基本就是跟前面算法描述的差不多,大家對著看就行,沒什么太難的地方。

public Graph getMinTree(){

int newArcs[][] = new int[this.nodes.size()][this.nodes.size()];

Map newNodes = new TreeMap();

newNodes.put(0, this.nodes.get(0));

while(newNodes.size() != this.nodes.size()){

int minWeight = 99999;

int minI = -1;

int minJ = -1;

for(int i : newNodes.keySet()){

for (int j = 0; j < this.nodes.size(); j ++){

if (i != j && !newNodes.containsKey(j)){

if (this.arcs[i][j] < minWeight){

minWeight = this.arcs[i][j];

minI = i;

minJ = j;

}

}

}

}

newNodes.put(minJ, this.nodes.get(minJ));

newArcs[minI][minJ] = minWeight;

newArcs[minJ][minI] = minWeight;

}

Graph res = new Graph();

res.arcs = newArcs;

res.nodes.addAll(newNodes.values());

return res;

}

下面有一次測試的輸出,2個圖,分別是原圖的所有權值信息,另一個是最小生成樹的權值信息

然后還可以用連通圖的dfs算法檢查一下。

Kruskal算法

先將所有邊按照權值,從小到大排序

依次訪問各邊,如果生成回路,則舍棄,否則加入生成樹,同時將該邊的另一頂點加入生成樹

直到所有頂點被加入

java實現,省略。

總結

以上是生活随笔為你收集整理的java带权连通图上最小权边,连通图最小生成树的算法及实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。