2013-11-15 168 views
2

我將給出某種類型的此圖,如下圖所示。我搜索了一些算法,但它接近,好像它是不可能讓我找出它們。實際上使用Floyd–Warshall algorithm這是有點可能,但不幸的是我只允許使用堆棧(而不是矩陣)。我也尋找Dijkstra's algorithm,但我無法得到與我的問題的關係。 picture使用堆棧查找加權圖的最短路徑

顯然我的目標是讓所有的最短路徑從一個點到另一個。正如我所提到的,我只是將我的堆棧中的解決方案輸出到一個向量字符串中。我想我必須訪問每個節點,而我最害怕的是在搜索過程中堆疊成一個循環,甚至丟失軌道。 另請注意,這是不是有向圖。如果Dijkstra的算法適用於此,我會非常感謝您是否有人會指導我,我真的很感謝任何幫助,建議,想法,甚至是在搜索時沒有陷入循環或丟失軌道的願景。

在此先感謝。

+1

可能更適合http://cs.stackexchange.com/ – yamafontes

+0

是不是加權的邊緣? – sukunrt

+0

不可以。它們的權重爲 – user2878007

回答

1

如果您只想從某些選定節點到所有其他節點的所有最短路徑的值,那麼使用Dijkstra算法將會很好 - 它基本上是增強的BFS。一旦你明白了BFS的理念,你就不應該對理解Dijkstra有任何問題。實際上,使用單個queue比使用arrays更容易實現BFS。 是否需要使用stacks纔是正式的(學校?)要求。如果是這樣,這是相當奇怪的......但你仍然可以模仿 - 完全低效的方式 - queue與兩個stacks

(順便說一句,DFS使用堆棧)

如果你想擁有來自所有其他節點的所有節點的所有所有的最短路徑,你可以從每個節點運行Dijkstra算法或者你可以嘗試貝爾曼 - 福特是位更快,但有點難以掌握。

如果您只想從單個節點到其他節點的最短路徑,(位增加)雙向BFS將是最佳選擇。

如果你的Silverlight插件,你可以嘗試在50%,這個小程序是我寫的: http://grzesiaka.home.pl/GraphTutor/你會發現有一步一步的算法,你有興趣(與數據結構和僞代碼演示)。希望它可以幫助你!

+0

非常感謝您的幫助。我會嘗試使用Dijkstra算法,但我對於跟蹤訪問節點以及主要是爲了不進入無限循環而有點困惑 – user2878007

+0

你只是跟蹤訪問節點 - 如果你只是有點棘手允許使用堆棧,但仍然可行。看看BFS的僞代碼(如果你有silverlight)。順便說一句:我會首先嚐試通常解決問題(沒有任何限制),並會嘗試滿足這些奇怪的要求。 –