2013-10-22 91 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并处理它。