coding A&D:圖:最小生成樹(二):破圈法
阿新 • • 發佈:2018-12-18
求MST的演算法中,prim演算法和kruskal演算法思想是:“加邊”;
破圈法正好相反,破圈即為:“減邊”。
破圈法是一種貪心演算法,思想大體如下:
1.找到圖中的一個圈;
2.刪除其中的權最大的邊;
3.重複上述操作,直到圖中已無圈。
以下為bd百科中的描述,更為準確、詳細:
破圈法,是區別於避圈法(Prim演算法和Kruskal演算法)的一種尋找最小生成樹的演算法,也就是MST的一種方法。破圈法是“見圈破圈”,即如果看到圖中有一個圈,就將這個圈的邊去掉一條,直至圖中再無一圈為止。
求最小生成樹有兩種方法,一種是破圈法,另一種是避圈法(Kruskal,Prim也是求MST的演算法)。
破圈法是“見圈破圈”,即如果看到圖中有一個圈,就將這個圈的邊去掉一條,直至圖中再無一圈為止。
步驟如下:
-
在圖中找一個迴路
-
去掉該回路中權值最大的邊,但要保持圖仍為連通。
-
反覆此過程,直至圖中再無迴路(但仍保持連通),得到最小生成樹。
最後結果根據操作選取不同可能不唯一,但圖的權值和(生成樹的代價)相同,均為最小值。
避圈法則採取先將圖中的點都取出來,然後,逐漸向上面添邊,並保證後添入的邊不與以前添上的邊構成圈就可以了,這個過程直到將邊集中能加入的邊(加入後不夠成圈)都加完為止。參見詞條“prime演算法”和“Kruskal演算法”。
注:其中破圈法和避圈法的" 圈"指的是迴路