在學習算法之前我們必須要了解克魯斯卡爾算法與prim算法一樣,也是一種用於解決最小生成樹問題的算法
應用場景-公交站問題
看一個應用場景和問題
克魯斯卡爾算法介紹
- 克魯斯卡爾(Kruskal)算法,是用來求加權連通圖的最小生成樹的算法。
- 基本思想:按照權值從小到大的順序選擇n-1條邊,並保證這n-1條邊不構成迴路
- 具體做法:首先構造一個只含n個頂點的森林,然後依權值從小到大從連通網中選擇邊加入到森林中,並使森林中不產生迴路,直至森林變成一棵樹爲止
算法步驟
- 第1步:將邊<E,F>加入R中。
邊<E,F>的權值最小,因此將它加入到最小生成樹結果R中。 - 第2步:將邊<C,D>加入R中。
上一步操作之後,邊<C,D>的權值最小,因此將它加入到最小生成樹結果R中。 - 第3步:將邊<D,E>加入R中。
上一步操作之後,邊<D,E>的權值最小,因此將它加入到最小生成樹結果R中。 - 第4步:將邊<B,F>加入R中。
上一步操作之後,邊<C,E>的權值最小,但<C,E>會和已有的邊構成迴路;因此,跳過邊<C,E>。同理,跳過邊<C,F>。將邊<B,F>加入到最小生成樹結果R中。 - 第5步:將邊<E,G>加入R中。
上一步操作之後,邊<E,G>的權值最小,因此將它加入到最小生成樹結果R中。 - 第6步:將邊<A,B>加入R中。
上一步操作之後,邊<F,G>的權值最小,但<F,G>會和已有的邊構成迴路;因此,跳過邊<F,G>。同理,跳過邊<B,C>。將邊<A,B>加入到最小生成樹結果R中。
此時,最小生成樹構造完成!它包括的邊依次是:<E,F> <C,D> <D,E> <B,F> <E,G> <A,B>。
根據前面介紹的克魯斯卡爾算法的基本思想和做法,我們能夠瞭解到,克魯斯卡爾算法重點需要解決的以下兩個問題:
- 問題一 對圖的所有邊按照權值大小進行排序。
- 問題二 將邊添加到最小生成樹中時,怎麼樣判斷是否形成了迴路。
問題一很好解決,採用排序算法進行排序即可。
問題二,處理方式是:記錄頂點在"最小生成樹"中的終點,頂點的終點是"在最小生成樹中與它連通的最大頂點"。然後每次需要將一條邊添加到最小生存樹時,判斷該邊的兩個頂點的終點是否重合,重合的話則會構成迴路。
如何判斷是否構成迴路?
我們加入的邊的兩個頂點不能都指向同一個終點,否則將構成迴路