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|)。