国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

ACM 最小生成樹 Constructing Roads

2019-11-11 06:34:30
字體:
供稿:網(wǎng)友

最小生成樹:一個(gè)有 n 個(gè)結(jié)點(diǎn)的連通圖的生成樹是原圖的極小連通子圖,且包含原圖中的所有 n 個(gè)結(jié)點(diǎn),并且有保持圖連通的最少的邊。

最小生成樹可以用kruskal(克魯斯卡爾)算法或PRim(普里姆)算法求出。

在一給定的無向圖G = (V, E) 中,(u, v) 代表連接頂點(diǎn) u 與頂點(diǎn) v 的邊,而 w(u, v) 代表此邊的權(quán)重,若存在 T 為 E 的子集且為無循環(huán)圖,使得的 w(T) 最小,則此 T 為 G 的最小生成樹。最小生成樹其實(shí)是最小權(quán)重生成樹的簡(jiǎn)稱。

例如:要在n個(gè)城市之間鋪設(shè)光纜,主要目標(biāo)是要使這 n 個(gè)城市的任意兩個(gè)之間都可以通信,但鋪設(shè)光纜的費(fèi)用很高,且各個(gè)城市之間鋪設(shè)光纜的費(fèi)用不同,因此另一個(gè)目標(biāo)是要使鋪設(shè)光纜的總費(fèi)用最低。這就需要找到帶權(quán)的最小生成樹。

Prim算法簡(jiǎn)述

1).輸入:一個(gè)加權(quán)連通圖,其中頂點(diǎn)集合為V,邊集合為E;2).初始化:Vnew= {x},其中x為集合V中的任一節(jié)點(diǎn)(起始點(diǎn)),Enew= {},為空;3).重復(fù)下列操作,直到Vnew= V:a.在集合E中選取權(quán)值最小的邊<u, v>,其中u為集合Vnew中的元素,而v不在Vnew集合當(dāng)中,并且v∈V(如果存在有多條滿足前述條件即具有相同權(quán)值的邊,則可任意選取其中之一);b.將v加入集合Vnew中,將<u, v>邊加入集合Enew中;4).輸出:使用集合Vnew和Enew來描述所得到的最小生成樹。

圖例描述:

圖例說明不可選可選已選(Vnew
 

此為原始的加權(quán)連通圖。每條邊一側(cè)的數(shù)字代表其權(quán)值。---

頂點(diǎn)D被任意選為起始點(diǎn)。頂點(diǎn)A、B、EF通過單條邊與D相連。A是距離D最近的頂點(diǎn),因此將A及對(duì)應(yīng)邊AD以高亮表示。C, GA, B, E, FD
 

下一個(gè)頂點(diǎn)為距離DA最近的頂點(diǎn)。BD為9,距A為7,E為15,F為6。因此,FDA最近,因此將頂點(diǎn)F與相應(yīng)邊DF以高亮表示。C, GB, E, FA, D
算法繼續(xù)重復(fù)上面的步驟。距離A為7的頂點(diǎn)B被高亮表示。CB, E, GA, D, F
 

在當(dāng)前情況下,可以在C、EG間進(jìn)行選擇。CB為8,EB為7,GF為11。E最近,因此將頂點(diǎn)E與相應(yīng)邊BE高亮表示。C, E, GA, D, F, B
 

這里,可供選擇的頂點(diǎn)只有CG。CE為5,GE為9,故選取C,并與邊EC一同高亮表示。C, GA, D, F, B, E

頂點(diǎn)G是唯一剩下的頂點(diǎn),它距F為11,距E為9,E最近,故高亮表示G及相應(yīng)邊EG。GA, D, F, B, E, C

現(xiàn)在,所有頂點(diǎn)均已被選取,圖中綠色部分即為連通圖的最小生成樹。在此例中,最小生成樹的權(quán)值之和為39。A, D, F, B, E, C, G
Kruskal算法簡(jiǎn)述       假設(shè) WN=(V,{E}) 是一個(gè)含有 n 個(gè)頂點(diǎn)的連通網(wǎng),則按照克魯斯卡爾算法構(gòu)造最小生成樹的過程為:先構(gòu)造一個(gè)只含 n 個(gè)頂點(diǎn),而邊集為空的子圖,若將該子圖中各個(gè)頂點(diǎn)看成是各棵樹上的根結(jié)點(diǎn),則它是一個(gè)含有 n 棵樹的一個(gè)森林。之后,從網(wǎng)的邊集 E 中選取一條權(quán)值最小的邊,若該條邊的兩個(gè)頂點(diǎn)分屬不同的樹,則將其加入子圖,也就是說,將這兩個(gè)頂點(diǎn)分別所在的兩棵樹合成一棵樹;反之,若該條邊的兩個(gè)頂點(diǎn)已落在同一棵樹上,則不可取,而應(yīng)該取下一條權(quán)值最小的邊再試之。依次類推,直至森林中只有一棵樹,也即子圖中含有 n-1條邊為止。

算法簡(jiǎn)單描述

1).記Graph中有v個(gè)頂點(diǎn),e個(gè)邊

2).新建圖Graphnew,Graphnew中擁有原圖中相同的e個(gè)頂點(diǎn),但沒有邊

3).將原圖Graph中所有e個(gè)邊按權(quán)值從小到大排序

4).循環(huán):從權(quán)值最小的邊開始遍歷每條邊 直至圖Graph中所有的節(jié)點(diǎn)都在同一個(gè)連通分量中

                if (這條邊連接的兩個(gè)節(jié)點(diǎn)于圖Graphnew中不在同一個(gè)連通分量中)

                添加這條邊到圖Graphnew

圖例描述:

首先第一步,我們有一張圖Graph,有若干點(diǎn)和邊 

 

將所有的邊的長(zhǎng)度排序,用排序的結(jié)果作為我們選擇邊的依據(jù)。這里再次體現(xiàn)了貪心算法的思想。資源排序,對(duì)局部最優(yōu)的資源進(jìn)行選擇,排序完成后,我們率先選擇了邊AD。這樣我們的圖就變成了右圖

 

 

 

在剩下的變中尋找。我們找到了CE。這里邊的權(quán)重也是5

依次類推我們找到了6,7,7,即DF,AB,BE。

下面繼續(xù)選擇, BC或者EF盡管現(xiàn)在長(zhǎng)度為8的邊是最小的未選擇的邊。但是現(xiàn)在他們已經(jīng)連通了(對(duì)于BC可以通過CE,EB來連接,類似的EF可以通過EB,BA,AD,DF來接連)。所以不需要選擇他們。類似的BD也已經(jīng)連通了(這里上圖的連通線用紅色表示了)。

最后就剩下EG和FG了。當(dāng)然我們選擇了EG。最后成功的圖就是右:

 

偽代碼

GenerieMST(G){                                                  //求G的某棵MSTT〈-¢;                                     //T初始為空,是指頂點(diǎn)集和邊集均空while T未形成G的生成樹 do{找出T的一條安全邊(u,v);  //即T∪{(u,v)}仍為MST的子集T=T∪{(u,v)};                          //加入安全邊,擴(kuò)充T}return T; //T為生成樹且是G的一棵MST}然后TOJ的話3451: Constructing Roads是用最小生成樹做的..但是我還沒做出來..等我做出來了后期補(bǔ)上...嗯..看了一些網(wǎng)上的代碼,,,感覺用Kruskal算法比較方便~大家可以先自己嘗試下哦!
上一篇:C#之MySql刪除

下一篇:Excel VBA 之 UBound

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 盈江县| 綦江县| 龙陵县| 钦州市| 日照市| 阿城市| 永吉县| 元阳县| 长子县| 灵璧县| 武陟县| 嘉黎县| 贞丰县| 浪卡子县| 辽中县| 富裕县| 勐海县| 赣榆县| 承德县| 从化市| 澎湖县| 九台市| 西乌| 昔阳县| 汉阴县| 天台县| 饶平县| 报价| 太和县| 安徽省| 乌审旗| 万全县| 双桥区| 山东省| 淮北市| 黄平县| 隆子县| 怀柔区| 运城市| 遂溪县| 北碚区|