1. 程式人生 > >coding A&D:圖:最小生成樹(二):破圈法

coding A&D:圖:最小生成樹(二):破圈法

求MST的演算法中,prim演算法kruskal演算法思想是:“加邊”;

破圈法正好相反,破圈即為:“減邊”。

破圈法是一種貪心演算法,思想大體如下:

1.找到圖中的一個圈;

2.刪除其中的權最大的邊;

3.重複上述操作,直到圖中已無圈。

以下為bd百科中的描述,更為準確、詳細:

破圈法,是區別於避圈法(Prim演算法和Kruskal演算法)的一種尋找最小生成樹的演算法,也就是MST的一種方法。破圈法是“見圈破圈”,即如果看到圖中有一個圈,就將這個圈的邊去掉一條,直至圖中再無一圈為止。

求最小生成樹有兩種方法,一種是破圈法,另一種是避圈法(Kruskal,Prim也是求MST的演算法)。

破圈法是“見圈破圈”,即如果看到圖中有一個圈,就將這個圈的邊去掉一條,直至圖中再無一圈為止。

步驟如下:

  1. 在圖中找一個迴路

  2. 去掉該回路中權值最大的邊,但要保持圖仍為連通。

  3. 反覆此過程,直至圖中再無迴路(但仍保持連通),得到最小生成樹。

最後結果根據操作選取不同可能不唯一,但圖的權值和(生成樹的代價)相同,均為最小值。

避圈法則採取先將圖中的點都取出來,然後,逐漸向上面添邊,並保證後添入的邊不與以前添上的邊構成圈就可以了,這個過程直到將邊集中能加入的邊(加入後不夠成圈)都加完為止。參見詞條“prime演算法”和“Kruskal演算法”。

注:其中破圈法和避圈法的" 圈"指的是迴路