我正在寫一個算法來找到第二分鐘生成樹。我的想法如下:第二分鐘成本生成樹
- 使用kruskals找到最低的MST。
- 刪除MST的最低成本邊緣。
- 再次在整個圖表上運行kruskals。
- 返回新的MST。
我的問題是:這會工作嗎?有沒有更好的方法來做到這一點?
我正在寫一個算法來找到第二分鐘生成樹。我的想法如下:第二分鐘成本生成樹
我的問題是:這會工作嗎?有沒有更好的方法來做到這一點?
考慮這種情況:
------100----
| |
A--1--B--3--C
| |
| 3
| |
2-----D
的MST由A-B-d-C(成本6)。第二個最小成本是A-B-C-D(成本7)。如果刪除最低成本優勢,您將獲得A-C-B-D(成本105)。
所以你的想法不會工作。我沒有更好的主意,但...
此外,如果最小邊緣碰巧連接一個垂飾頂點,刪除它並重新計算MST甚至不會給你一個MST。 – csprajeeth 2013-09-11 17:20:54
你可以這樣做 - 嘗試從圖中一次一個地移除MST的邊緣,然後運行MST,從中取出最小值。所以這與您的類似,除了迭代:
您可以在O(V )中做到這一點。首先使用Prim's algorithm計算MST(可以在O(V ))中完成。
計算max[u, v] = the cost of the maximum cost edge on the (unique) path from u to v in the MST
。可以在O中完成(V )。
找到邊緣(u, v)
這不是MST的一部分,它將abs(max[u, v] - weight(u, v))
最小化。可以在O(E)== O(V )中完成。
返回MST' = MST - {the edge that has max[u, v] weight} + {(u, v)}
,它會給你第二好的MST。
Here's a link僞代碼和更詳細的解釋。
這裏是一個計算所述第二最小生成樹爲O樹(N^2)
可以說當前樹的邊緣是e。這棵樹邊緣將樹分成兩棵樹,比如說T1和T-T1。 e=(u,v)
其中u在T1中,v在T-T1中。 = O(n^2)
對於T-T1中的每個頂點v重複。 = O(N^2)
在T-T1和e所有v選擇邊緣e'=(u,v)
」在G(原始圖),它是最小
計算新形成的樹的重量。比方說W=weight(T)-weight(e)+weight(e')
這與拉里的回答了一個T1。
在MST
對於每個new_edge =不是一個邊緣之後添加到new_edge MST。
您的方法不起作用,因爲它可能是最小的情況。 MST中的加權邊是一個橋(只有一條邊連接圖的兩部分),因此從該集刪除該邊將導致2個新的MST與一個MST相比。
輕微修改您的算法。
Use kruskals to find lowest MST.
for all edges i of MST
Delete edge i of the MST.
Run kruskals again on the entire graph.
loss=cost new edge introduced - cost of edge i
return MST for which loss is minimum
好吧,我有另一種想法......但我不是很確定那個作品.....在以前的避免邊緣中添加最小重量到最新的Mst。如果我的想法是錯誤的,所有人都可以舉個例子嗎? – 2011-09-12 20:57:45