在这种情况下,哪种图表遍历算法适合

时间:2013-10-22 14:20:40

标签: c# algorithm graph graph-theory graph-traversal

我在遍历以下类型的图表时遇到问题。

Graph to traverse

  • 每个节点可能有多个输入和输出。
  • 每个输出可以指向多个输入(例如A的第三个输出转到C和D)
  • 在每个节点处,根据输入中提供的值进行一些计算。输出结果提供给其他节点的输入。
  • 要从一个节点遍历到下一个节点,我必须知道所有输入的值。

这种遍历浮现在脑海中:

  • 在A处,使用唯一的输入来计算所有输出
  • 使用A的第一个输出从A移动到C.
  • 在C,我们不知道其他输入,所以回溯到A。
  • 在A处,使用第二个输出到达B.
  • 在B,我们没有所有输入,所以回溯到A。
  • 在A处,取第三个输出并到达B.
  • 现在我们有了计算输出的所有输入。
  • 在B处,通过第一个输出达到C。
  • 在C,我们有所有输入,所以进行计算并达到E。

那么你认为在这种情况下哪种算法最好用。 BFS可能无法正常工作,因为在我的情况下,当我到达一个节点并且无法进行回溯时,我不知道所有输入。

我必须在C#中实现它。

1 个答案:

答案 0 :(得分:4)

<强>观

使用广度优先搜索,但也计算每个节点(或类似地,输入列表)。

访问节点时:

  • 增加点数
  • 如果计数小于它的传入边数,则不要做任何事情
  • 否则,照常处理节点

您的例子:

候选人:A
我们处理A。

候选人:C,B,D
我们访问C,但不处理它的count = 1&lt; 2 =传入边缘。

候选人:B,D
我们访问B并处理它。

候选人:D,C,E,D
我们访问D,但不处理它,因为它的count = 1&lt; 2 =传入边缘(第二条边缘尚未处理)。

候选人:C,E,D
我们访问C并处理它。

候选人:E,D,E
我们访问E,但不处理它的计数= 1&lt; 3 =传入边缘(第二和第三边缘尚未处理)。

候选人:D,E
我们访问D并处理它。

候选人:D,E,E
我们访问D并处理它。

候选人:E,E
我们访问E,但不要处理它,因为它的计数= 2&lt; 3 =传入边缘(第三条边缘尚未处理)。

候选人:E
我们访问E并处理它。