圖論入門(七)最小生成樹

轉載自https://blog.csdn.net/saltriver/article/details/72568556

最小生成樹:

       一個正在進行信息化建設的國家級貧困縣,需要在下屬9個鄉鎮之間架設光纖網絡。爲減少建設難度,光纖網主要沿着這9個鄉鎮之間互連的公路進行鋪設。這9個鄉鎮之間的公路網以及相互之間的距離(單位:km)如下圖所示:

       在這個實際應用中,我們的目的,是要尋求一種連接圖中所有節點的、成本最低的方式。本質上,再抽象一層,這是個組合優化問題,可以使用一些智能優化算法來解決。而在這個實例上,我們尋求使用更簡單的圖論方式解決。

        要包含圖中所有的頂點n,同時代價最少,第一個想到的自然是減少邊的數量,而要連接所有n個頂點,顯然至少需要n-1條邊。而我們知道一顆樹(tree)就是n個頂點,n-1條邊。所以,這裏引申出圖論中的一個新概念:生成樹(spanning tree)。含有圖中全部n個頂點,以及包含圖中某些n-1條邊的一顆樹是該圖的生成樹。有幾個情況需要注意:

  • 圖本身必須是無向連通圖; 
    如果是非連通圖,那就不存在生成樹的概念。我們知道樹中任意2點都是連通的。如果是有向圖,那也沒有這個概念。
  • 生成樹不止一種; 
    生成樹的n-1條邊可以在圖的邊集合中選擇,當然不止一種情況。
  • 每個生成樹代價不同。 
    一般使用生成樹中邊的權重值總和代表每個生成樹的代價。 
    而我們的工作就是要找到所有生成樹中代價最小的,這就是最小生成樹(minimum spanning tree)問題。

那麼,我們構建最小生成樹的時候,要從哪裏着手呢?

首先,我們從邊出發,先找到最短的邊e-i。

        假設生成樹不包含最短邊e_i,無論移除其他邊中的哪條邊,重新構成新的生成樹都比最先的生成樹代價小,因爲哪條邊的代價都比邊e-i的代價要大。也就是說,任何不包含最短邊的生成樹結構都可以被做的更小。所以,最小生成樹一定包含最短邊。(後面的文章我們將看到,這也是最小生成樹算法Kruskal的基本思想)。

其次,我們從頂點出發。

       我們以頂點b爲例,根據生成樹的定義,頂點b與其它頂點肯定是連通的。而頂點b有2條邊,即邊a-b,邊b-d。這意味着最小生成樹必然包含這2條邊中的一個。而邊b-d比a-b要短,因此選擇b-d是否更合理? 我們用反證法證明下,假設選擇較長的邊a-b是更好的選擇,即最小生成樹包含a-b這條邊。我們把邊b-d也加入這個生成樹,形成了一個環。在這個環中,如果移除邊a-b,那麼得到的新生成樹代價比以前的要小,這與假設的選擇較長邊更好相矛盾。所以在b點選擇較短的邊纔有可能生成最小生成樹。(後面的文章我們將看到,這也是最小生成樹算法Prim的基本思想)。