算法與數據結構學習(56)-程序員常用10種算法(克魯斯卡爾算法)

在學習算法之前我們必須要了解克魯斯卡爾算法與prim算法一樣,也是一種用於解決最小生成樹問題的算法

應用場景-公交站問題

看一個應用場景和問題
在這裏插入圖片描述

克魯斯卡爾算法介紹

  1. 克魯斯卡爾(Kruskal)算法,是用來求加權連通圖的最小生成樹的算法。
  2. 基本思想:按照權值從小到大的順序選擇n-1條邊,並保證這n-1條邊不構成迴路
  3. 具體做法:首先構造一個只含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>。

根據前面介紹的克魯斯卡爾算法的基本思想和做法,我們能夠瞭解到,克魯斯卡爾算法重點需要解決的以下兩個問題:

  1. 問題一 對圖的所有邊按照權值大小進行排序。
  2. 問題二 將邊添加到最小生成樹中時,怎麼樣判斷是否形成了迴路。

問題一很好解決,採用排序算法進行排序即可。
問題二,處理方式是:記錄頂點在"最小生成樹"中的終點,頂點的終點是"在最小生成樹中與它連通的最大頂點"。然後每次需要將一條邊添加到最小生存樹時,判斷該邊的兩個頂點的終點是否重合,重合的話則會構成迴路。

如何判斷是否構成迴路?
我們加入的邊的兩個頂點不能都指向同一個終點,否則將構成迴路

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