2013-10-22 86 views
1

我有一個遍歷以下類型圖的問題。在這種情況下適用哪種圖遍歷算法

Graph to traverse

  • 在每個節點可能有多個輸入和輸出。
  • 每個輸出可以直接向多個輸入(例如,A的第三輸出變爲C和d)
  • 在一些計算是基於在輸入提供的值完成每個節點。輸出的結果被提供給其他節點的輸入。
  • 要從一個節點遍歷到下一個節點,我必須知道所有輸入的值。

此遍歷想到:

  • 在A,使用的唯一輸入,以計算所有輸出
  • 移動從A到C使用A.
  • 的第一輸出在C,我們不知道其他輸入如此回溯到A.
  • 在A處,使用第二個輸出來達到B.
  • 在B處,我們沒有所有輸入以便回溯到A.
  • 在A處,取第三個輸出並達到B.
  • 在B處,現在我們有所有輸入來計算輸出。
  • 在B,通過第一輸出達到C.
  • 在C,我們有所有的投入等都做了計算,並達到E.

那麼遍歷算法中你認爲會在這種情況下效果最好。 BFS可能無法工作,因爲在我的情況下,當我到達節點並且不可能回溯時,我不知道所有的輸入。

我必須在C#中實現這一點。

回答

4

點子:

使用廣度優先搜索,而且還具備在每個節點上的計數(或,類似地,的輸入列表)。

當你訪問一個節點:

  • 增加其數量
  • 如果計數小於它有入邊的數量,不要做任何
  • 否則,處理節點通常

你舉的例子:

考生:A
我們處理A.

候選人:C,B,D
我們訪問C,但不處理它,因爲它的計數= 1 < 2 =傳入邊緣。

考生:B,D
我們拜訪B並處理它。

考生:d,C,E,d
我們訪問d,但不處理它作爲計數= 1 < 2 =輸入的邊緣(第二邊緣尚未處理過的)。

考生:C,E,D
我們訪問C並處理它。

考生:E,d,E
我們訪問E,但不處理它作爲計數= 1 < 3 =進入的邊緣(在第二和第三邊緣還沒有被處理過)。

考生:D,E
我們訪問D並處理它。

考生:D,E,E
我們訪問D並處理它。

考生:E,E
我們參觀E,但不處理它作爲計數= 2 < 3 =入邊(第三邊尚未處理)。

考生:E
我們訪問E並處理它。