【轉】兩種最小生成樹畫法


轉自:https://www.cnblogs.com/yonglin1998/p/11780790.html

關於圖的幾個概念定義:

  • 連通圖:在無向圖中,若任意兩個頂點vi與vj都有路徑相通,則稱該無向圖為連通圖。

  • 強連通圖:在有向圖中,若任意兩個頂點vi與vj都有路徑相通,則稱該有向圖為強連通圖。

  • 連通網:在連通圖中,若圖的邊具有一定的意義,每一條邊都對應着一個數,稱為權;權代表着連接連個頂點的代價,稱這種連通圖叫做連通網。

  • 生成樹:一個連通圖的生成樹是指一個連通子圖,它含有圖中全部n個頂點,但只有足以構成一棵樹的n-1條邊。一顆有n個頂點的生成樹有且僅有n-1條邊,如果生成樹中再添加一條邊,則必定成環。

  • 最小生成樹:在連通網的所有生成樹中,所有邊的代價和最小的生成樹,稱為最小生成樹。

在這里插入圖片描述


下面介紹兩種求最小生成樹算法

1.Kruskal算法

此算法可以稱為“加邊法”,初始最小生成樹邊數為0,每迭代一次就選擇一條滿足條件的最小代價邊,加入到最小生成樹的邊集合里。

  1. 把圖中的所有邊按代價從小到大排序;
  2. 把圖中的n個頂點看成獨立的n棵樹組成的森林;
  3. 按權值從小到大選擇邊,所選的邊連接的兩個頂點ui,vi,應屬於兩顆不同的樹,則成為最小生成樹的一條邊,並將這兩顆樹合並作為一顆樹。
  4. 重復(3),直到所有頂點都在一顆樹內或者有n-1條邊為止。

在這里插入圖片描述

2.Prim算法

此算法可以稱為“加點法”,每次迭代選擇代價最小的邊對應的點,加入到最小生成樹中。算法從某一個頂點s開始,逐漸長大覆蓋整個連通網的所有頂點。

  1. 圖的所有頂點集合為V;初始令集合u={s},v=V−u ;
  2. 在兩個集合u,vu,v能夠組成的邊中,選擇一條代價最小的邊(u0,v0),加入到最小生成樹中,並把v0並入到集合u中。
  3. 重復上述步驟,直到最小生成樹有n-1條邊或者n個頂點為止。

由於不斷向集合u中加點,所以最小代價邊必須同步更新;需要建立一個輔助數組closedge,用來維護集合v中每個頂點與集合u中最小代價邊信息:

struct { char vertexData //表示u中頂點信息 UINT lowestcost //最小代價 }closedge[vexCounts] 

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM