最小生成樹

2021-10-04 21:40:40 字數 2956 閱讀 2729

枯木逢春不在茂,年少且惜鏡邊人

終是魔王夢了蝶,亦是恩靜亦是劫

這週呢學習一下最小生成樹的一些演算法,而且離開學恐怕不遠了,所以在下週準備複習這段時間學過的演算法,順便刷刷題,對,是這樣的。首先呢, 我們看看最簡單的例子題目意思:最近小哼迷上了《龍門鏢局》,從恰克圖道武夷山,從張家口道老河口,從迪化道佛山,從蒙自道奉天…古代鏢局的運鏢,也就是現在的物流。鏢局每到乙個地方開展業務,都需要堆運鏢途中的綠林好漢進行打點(不給錢就不讓過路)。好說話的打點費就比較低,不好說話的打點費就比較高。城鎮類似如下,頂點是城鎮編號,邊上的值表示這條道路上打點綠林好漢需要的銀子數。

input
6 9

2 4 11

3 5 13

4 6 3

5 6 4

2 3 6

4 5 7

1 2 1

3 4 9

1 3 2

意思就是讓找出乙個樹然後使這中間的打點的銀子最少也就是找出最小生成樹n個點 需要n-1條邊,那麼怎麼找呢?貪心法則:每次都選擇最小的邊

當然在選擇的時候可能會遇到形成乙個迴路,這個時候就要用到並查集的作用

詳細請看**

另外書上還介紹了一種方法,就是堆,運用堆的話就可以很好的減少時間複雜度額,我剛看了下,太菜了,所以學習了一下鄰接表,

先看看**吧

#includeint main()

return 0;

}

這裡面第一次看可能看不懂

但是如果你能手寫一邊過程

並且結合**看看就會懂了

for(i=1;i<=m;i++)

這裡說一下frist陣列儲存的是這條路徑的編號,他的下標就是這條路徑的第乙個節點而next陣列儲存的是frist陣列的下一條路徑,通過下標可以找出這些路徑下面我們看看怎麼輸出這些路徑話不多說 上**

#includeint main()		

for(i=1;i<=n;i++)

} return 0;

}

這就是**的輸出另外

for(i=1;i<=n;i++)

}

這部分 利用k來不斷搜尋祖宗節點的路徑,這樣搜尋出來剛好是輸入是相反路徑,這其實也很像遞迴,都是反著出來,有時候也有秒用

這就是輸出,可能不太明顯,但是事實就是相反的.ok,解決了這個問題,在用堆解決這個問題的時候還需要複習一下堆,ok ,複習一下

這段**是我剛學習的有點長,理解的不透徹,讓我再學習幾天再來,說說,詳細請看下週週報,以為這週就可以學完這本書,沒想到,後面的挺吃力,所以就分兩周來學,其實在學習後面的同時也是對前面的複習,所以預習 學習 加複習同時進行才是最好的我們下週見

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...

最小生成樹

define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...