Prim's和Kruskal的算法用於查找已連接和未連接的圖的最小生成樹。爲什麼他們不能用在一個指向的圖表上?爲什麼不能在有向圖上使用Prim's或Kruskal的算法?
回答
這些算法首先起作用是一個小小的奇蹟 - 大多數貪婪算法只是在某些情況下發生崩潰和燒燬。假設你想使用它們來找到一個最小跨度樹狀結構(從一個頂點到所有其他頂點的有向路徑),那麼Kruskal的一個有問題的圖看起來像這樣。
5
--> a
//^
s 1| |2
\ v/
--> b
3
我們將採用A->成本1的B圓弧,然後會被卡住,因爲我們真的想S-> b成本3和B-> A成本的2
對於普里姆,這個圖是有問題的。
5
--> a
//
s 1|
\ v
--> b
3
我們將採取S-> b成本3的,但我們真的想S->成本5和A->說明B成本的1
普里姆的和Kruskal算法輸出最小生成樹連接和「無向」圖。如果它沒有連接,我們可以調整它們以輸出最小生成森林。
在Prim的算法中,我們將圖分成兩組頂點。一組已經形成MST的探索頂點(Set1)和另一組未開發的頂點將最終加入第一組以完成「跨越」(Set2)。在每一瞬間,我們選擇加入兩個不相交集合的切割中的最小加權邊緣。如果沒有從MST的探索節點到剩餘的未探索節點的有向邊,即使存在從未探索節點到MST中探索節點的邊,算法仍然卡住。
在Kruskal算法中,其思想是按照它們的權重按升序對邊進行排序,並按順序挑選它們,並將它們包括在MST探索的節點/邊中,前提是它們不能與探索節點形成循環。這由Union-Find DS完成。但是使用這種方法檢測有向圖的循環失敗。例如:包含邊[1-> 2] [2-> 3] [1-> 3]的圖將被報告包含使用Union-Find方法的循環。
因此,Prim的失敗,因爲它假設,每個節點都可以從每個節點到達,儘管有效的無向圖可能不適用於有向圖。克魯斯卡爾失敗是因爲未能檢測到週期,有時候必須增加邊緣週期以滿足MST的「最小」加權屬性。
此外,在有向圖的情況下,MST沒有完全意義。它與二叉樹的等價物是「最小跨度樹狀結構」,它將產生一棵樹,每個頂點可以從一個頂點到達。
:)謝謝greybeard。現在更正! – elborak9
- 1. Prims算法:圖論
- 2. MST - Prims算法使用C
- 3. 爲什麼kruskal算法和dijkstra算法如此相似?
- 4. 有向圖中的Prims和Bellman-Ford算法
- 5. Kruskal的C++算法
- 6. Kruskal在Python中的算法
- 7. 給Dijkstra算法的Prims算法
- 8. Kruskal算法(排序)
- 9. Kruskal算法實現
- 10. Prim's和Kruskal算法
- 11. Kruskal算法解釋
- 12. 在sparce圖上執行Kruskal算法的最佳數據結構?
- 13. 最小生成樹使用Kruskal算法
- 14. MySQL整數向上或向下舍入,爲什麼不能使用小數?
- 15. 爲什麼STL算法find()在地圖上不起作用?
- 16. 爲什麼不能成爲無向圖?
- 17. 爲什麼不能在IE上使用?
- 18. 爲什麼不能在Firefox上使用?
- 19. 爲什麼三元運算符不能使用重定向
- 20. 使用Kruskal算法尋找圖的最小切割值
- 21. 使用Kruskal算法尋找圖中的最小切點?
- 22. 爲什麼我不能在Parallel.For或Parallel.Foreach上使用List.Add()?
- 23. 爲什麼我不能在Set或Map上使用Object.keys()?
- 24. MST Kruskal算法(時限)
- 25. Kruskal和Prim算法的應用程序
- 26. 爲什麼我的Dijkstra算法在Java中實現無向圖不起作用?
- 27. D3.js使用什麼算法來使用力指向圖?
- 28. 在最小生成樹的Prims算法中π[v]←u是什麼意思?
- 29. 如何在3d空間中使用Prims算法
- 30. 爲什麼中位數算法不能使用塊大小3?
那麼,有向圖上生成樹的定義是什麼? – elias
針對有向圖的MST的類似問題將是成本最小的arborescene或最小分支問題。 [Edmond算法](http://en.wikipedia.org/wiki/Edmond's_algorithm)可以像Prim一樣使用漸近複雜度,但它在概念上更復雜。 –