最小生成樹(Prim算法、Kruskal算法)


1、最小生成樹(MST)

  a、連通圖生成樹包含所有的頂點,並且含盡可能少的邊。權值之和最小的生成樹稱為最小生成樹。

  b、生成最小生成樹的算法主要有Prim算法和Kruskal算法,基於貪心算法的策略。

  c、生成的最小生成樹不一定唯一各邊權值不相同時,最小生成樹唯一。    

            

2、Prim(普里姆)算法

  a、Prim算法適合稠密圖(邊相對於結點更多)

  b、初始化是一個結點。

  c、原理:

  相當於把所有結點分為兩大類頂點集U(已經確定的結點)和V(未被確定的結點),U和V之間有邊相連,每次找這些邊中最小權值的邊,將該邊對應的V中的結點再添加到U中,繼續重復操作,直到全部結點都為U中的結點。最小生成樹構建完成。Prim算法的生成樹不唯一(每次選擇最小邊的時候,可能存在多條同樣權值的邊可選,此時任意選其一就可以)。

  d、因為時間復雜度只和結點數V有關,所以適合稠密圖。時間復雜度是O(|V|2

3、Kruskal(克魯斯卡爾)算法

  a、Kruskal算法適合稀疏圖(結點相對於邊更多)

  b、初始化是把所有結點加入到頂點集中,根據要求挑選下一條邊。

  c、原理:

    相當於把所有邊按照從小到大順序排好,依次從中抽取出最小權值的邊,如果添加一個邊之后,這個邊和已經確定的邊形成了回路,則將這個邊舍棄,因為不滿足最小生成樹的要求。直到最后形成n-1條邊(n是總結點數),則構建完成。

    其中判斷是否構成回路利用到了並查集,排序用到Sort()函數

    

  d、時間復雜度只與邊有關,所以適合稀疏圖。

     其中邊數是|E|,因為算法中用到了堆排序,堆排序的時間復雜度是Log|E|,所以總的時間復雜度是O(|E|log|E|)。

  


免責聲明!

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



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