电竞比分网-中国电竞赛事及体育赛事平台

分享

圖論: 8.5 最小生成樹

 shaobin0604@163.com 2006-09-24

8.5最小生成樹
最小生成村樹有很多種解決方案,可以分為幾類:
1.創(chuàng)建并擴展一些樹,使它們合并成更大的樹(Boruvka)
2.創(chuàng)建一個樹的集構(gòu)成一棵生成樹(Kruskal)
3.創(chuàng)建并擴展一棵樹,為它添加新的樹枝(Prim)
4.創(chuàng)建并擴展一棵樹,為它添加新的樹枝,也可能從中刪除一些樹枝(Dijkstra)

8.5.1 Boruvka算法:
最早的查找最小生成樹的算法可能是1926年Otakaar.Boruvka提出的。在這個方法中,我們從有|V|個頂點的樹的某個頂點開始,然后對每個頂點v查找所有從v向外的邊中權(quán)最小的edge(vu)并創(chuàng)建一個包括這些邊的最小的樹。然后,查找能夠?qū)⑦@些樹連接成一個大樹的權(quán)最小的邊。創(chuàng)建好一棵樹之后,程序結(jié)束。
BoruvkaAlgorithm(帶權(quán)連通無向圖 graph)
 令每一個頂點都成為一棵單頂點樹的根;
 while 單頂點樹的數(shù)量大于1
  for 每棵樹t
   e = 權(quán)值最小的邊(vu),其中v在樹t中而u不屬于t;
   將樹t和包含頂點u的樹連接成一棵樹,如果它尚未創(chuàng)建的話;
說明:
在while循環(huán)珠每次重復中,每個現(xiàn)存的r樹和一條邊相連,得到至少一棵樹。最壞情況下,產(chǎn)生r/2棵樹;最好情況下,產(chǎn)生一棵樹。后來的重復中,有r/4棵樹等等。最壞情況下,需要lg|V|次重復,|V|是單頂點樹的初始值。Boruvka算法非常適合并行處理,因為對于每一棵樹,必須獨立地找到最小邊。

8.5.2 Kruskal算法
先把所有的邊根據(jù)權(quán)排序,然后檢測這個排序序列中的每一條邊,看一下在構(gòu)造時,它能否考慮成為樹的一部分。如果加入它不產(chǎn)生環(huán)路就將它添加到樹中。
KruskalAlgorithm(帶權(quán)連通無向圖 graph)
 tree = null;
 edges = 按照權(quán)值大小排序的graph的全部邊;
 for (i = 1; i <= |E| and |tree| < |V| - 1; i++)
  if edges中的邊edges[i]和tree中的邊不產(chǎn)生環(huán)路
   將edges[i]加進tree;
說明:
這個算法的復雜度是由所采用的排序復雜度確定的,對一個有效的排序的復雜度,對一個有效的排序的復雜度是O(|E|lg|E|)。它也依賴于環(huán)路檢測方法的復雜度。如果使用union()實現(xiàn)Kruskal算法,那么for循環(huán)變成
for (i = 1; i <= |E| and |tree| < |V| - 1; i++)
 union(edge[i] = edge(vu));
盡管union()可以被調(diào)用至多|E|次,在檢測到一個環(huán)路(第一次)之后它就退出并且執(zhí)行一個聯(lián)合,復雜度是O(|V|),只將|V|-1條邊加入到tree中。因些KruskalAlgorithm的for循環(huán)的復雜度是O(|E| + (|V| - 1)|V|),也就是O(|V|^2)。所以KruskalAlgorithm的復雜度取決于一個排序算法的復雜度O(|E|lg|E|)。

8.5.3 Jarnik.Prim算法
在這個方法中,開始時所有的邊都是排序的,但是準備加入生成樹的邊不僅不會在樹中產(chǎn)生環(huán)路,而且也和樹中已經(jīng)有的一個頂點關(guān)聯(lián)。
JarnikPrimAlgorithm(帶權(quán)連通無向圖 graph)
 tree = null;
 edges = 按權(quán)值大小排序的graph的全部邊
 for i = 1 到|V| - 1
  for j = 1 到 |edges|
   if edges 中的邊edges[j]和tree中的邊不會產(chǎn)生回路并且和tree中的一個頂點關(guān)聯(lián)
    將edges[j]添加進tree;
    break;

8.5.4 Dijkstra算法
JarnikPrimAlgorithm(帶權(quán)連通無向圖 graph)
 tree = null;
 edges = 未排序的graph全部邊;
 for j = 1 到 |edges|
  將edges[j]添加進tree;
  if 在tree中有環(huán)路
   從這個環(huán)路中刪除權(quán)值最大的一條邊;

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多