算法複習(一) 最小生成樹相關問題

很長一段時間內,zhn_666每週會更一些之前的學過的算法,也會把曾經因爲懶惰之類的原因沒學的算法重新學一遍,這次會好好寫博客,希望有緣人看到也能學到點東西

這周俺要複習的算法是有關最小生成樹的
首先介紹一些關於圖的定義

- 連通圖:在一張無向圖中,任意兩點都聯通,則稱此無向圖爲連通圖
- 強連通圖:在一張有向圖中,任意兩點都聯通,則稱此有向圖爲強連通圖
- 生成樹:在有n個點連通圖中,選n-1條邊構成的連通子圖,則爲一棵生成樹。
- 最小生成樹:在生成樹中,使得這n-1條邊權值和最小,爲最小生成樹。

解決最小生成樹類的問題有主要兩種方法,第一種爲Kruskal算法,第二種爲prim算法

  1. Kruskal 算法
    此算法可以稱爲“加邊法”,初始最小生成樹邊數爲0,每次就選擇一條滿足條件的最小代價邊,加入到最小生成樹的邊集合裏。
    (1) 把圖中的所有邊按代價從小到大排序,把每個點看成一棵樹;
    (2) 按權值從小到大選擇邊,所選的邊連接的兩個頂點u,v,u,v,應屬於兩顆不同的樹,則成爲最小生成樹的一條邊,並將這兩顆樹合併作爲一顆樹。(前置技能:並查集)
    (3)重複(2),直到構成了一棵n-1條邊的樹。

  2. prim 算法
    此算法可以稱爲“加點法”,我們隨便選擇一個不在圖中的點,選擇它與這張圖能相連的最小權值的邊,直到構成一棵樹。
    (1) 在一個加權連通圖中,頂點集合V,邊集合爲E
    (2) 任意選出一個點作爲初始頂點,標記爲visit,計算所有與之相連接的點的距離,選擇距離最短的,標記visit.
    (3) 重複以下操作,直到所有點都被標記爲visit:

題單(先寫一發水的,代碼日後會更新 咕咕咕警告在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章