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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

有向图生成树是如何画的_漫画:什么是最小生成树?

發布時間:2024/7/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 有向图生成树是如何画的_漫画:什么是最小生成树? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者 | 小灰

來源 | 程序員小灰

————— 第二天 —————

————————————

首先看看第一個例子,有下面這樣一個帶權圖:

它的最小生成樹是什么樣子呢?下圖綠色加粗的邊可以把所有頂點連接起來,又保證了邊的權值之和最小:

去掉那些多余的邊,該圖的最小生成樹如下:

下面我們再來看一個更加復雜的帶權圖:

同樣道理,下圖綠色加粗的邊可以把所有頂點連接起來,又保證了邊的權值之和最小:

去掉那些多余的邊,該圖的最小生成樹如下:

怎樣鋪設才能保證成本最低呢?

城市之間的交通網就像一個連通圖,我們并不需要在每兩個城市之間都直接進行連接,只需要一個最小生成樹,保證所有的城市都有鐵路可以觸達即可。

Prim算法是如何工作的呢?

這個算法是以圖的頂點為基礎,從一個初始頂點開始,尋找觸達其他頂點權值最小的邊,并把該頂點加入到已觸達頂點的集合中。當全部頂點都加入到集合時,算法的工作就完成了。Prim算法的本質,是基于貪心算法

接下來說一說最小生成樹的存儲方式。我們最常見的樹的存儲方式,是鏈式存儲,每一個節點包含若干孩子節點的指針,每一個孩子節點又包含更多孩子節點的指針:

這樣的存儲結構很清晰,但是也相對麻煩。為了便于操作,我們的最小生成樹用一維數組來表達,數組下標所對應的元素,代表該頂點在最小生成樹當中的父親節點。(根節點沒有父親節點,所以元素值是-1)

下面讓我們來看一看算法的詳細過程:

1.選擇初始頂點,加入到已觸達頂點集合。

2.從已觸達頂點出發,尋找到達新頂點的權值最小的邊。顯然從0到2的邊權值最小,把頂點2加入到已觸達頂點集合,Parents當中,下標2對應的父節點是0。

3.從已觸達頂點出發,尋找到達新頂點的權值最小的邊。顯然從2到4的邊權值最小,把頂點4加入到已觸達頂點集合,Parents當中,下標4對應的父節點是2。

4.從已觸達頂點出發,尋找到達新頂點的權值最小的邊。顯然從0到1的邊權值最小,把頂點1加入到已觸達頂點集合,Parents當中,下標1對應的父節點是0。

5.從已觸達頂點出發,尋找到達新頂點的權值最小的邊。顯然從1到3的邊權值最小,把頂點3加入到已觸達頂點集合,Parents當中,下標3對應的父節點是1。

這樣一來,所有頂點都加入到了已觸達頂點集合,而最小生成樹就存儲在Parents數組當中。

final static int INF = Integer.MAX_VALUE;

public static int prim(int[][] matrix){

List reachedVertexList = new ArrayList;

//選擇頂點0為初始頂點,放入已觸達頂點集合中

reachedVertexList.add(0);

//創建最小生成樹數組,首元素設為-1

int parents = new int[matrix.length];

parents[0] = -1;

//邊的權重

int weight;

//源頂點下標

int fromIndex = 0;

//目標頂點下標

int toIndex = 0;

while (reachedVertexList.size < matrix.length) {

weight = INF;

//在已觸達的頂點中,尋找到達新頂點的最短邊

for (Integer vertexIndex : reachedVertexList) {

for (int i = 0; i < matrix.length; i++) {

if (!reachedVertexList.contains(i)) {

if (matrix[vertexIndex][i] < weight) {

fromIndex = vertexIndex;

toIndex = i;

weight = matrix[vertexIndex][i];

}

}

}

}

//確定了權值最小的目標頂點,放入已觸達頂點集合

reachedVertexList.add(toIndex);

//放入最小生成樹的數組

parents[toIndex] = fromIndex;

}

return parents;

}

public static void main(String[] args) {

int matrix = new int{

{0, 4, 3, INF, INF},

{4, 0, 8, 7, INF},

{3, 8, 0, INF, 1},

{INF, 7, INF, 0, 9},

{INF, INF, 1, 9, 0},

};

int parents = prim(matrix);

System.out.println(Arrays.toString(parents));

}

這段代碼當中,圖的存儲方式是鄰接矩陣,在main函數中作為測試用例的圖和對應的鄰接矩陣如下:

當然,也可以使用鄰接表來實現prim算法,有興趣的小伙伴可以嘗試寫一下代碼。

總結

以上是生活随笔為你收集整理的有向图生成树是如何画的_漫画:什么是最小生成树?的全部內容,希望文章能夠幫你解決所遇到的問題。

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