使用向后和向前链接收集DAG的所有路径

时间:2013-02-01 18:26:59

标签: c# algorithm graph-theory

我有一个有向无环图,其中每个节点由状态

表示
public class State{
   List<State> ForwardStates;
   List<State> backStates;
   string stateName;
}

其中ForwardStates是来自当前状态的前向链接的状态列表。 和backStates是通过当前状态的反向链接的状态列表。

我有两个特殊状态

State initialState (name=initial)
State finalState (name=final)

我希望找到从初始状态到最终状态的所有路径,并填入

List<List<string>> paths

例如,如下图所示

enter image description here

其中后向链接用棕色虚线箭头表示 前向链接用黑色具体箭头表示, 可能的路径是 {{initial,b,a,final},{initial,c,final},{initial,b,initial,final}}

规则是从初始状态开始,它必须通过一个或多个反向链接,然后才能通过前向链接,一旦切换到前向链接,它将保持转发链接(即,它不能使用向后链接)。

这个问题是这个问题的延伸(Collecting all paths of DAG)。

1 个答案:

答案 0 :(得分:2)

使用仅使用向后链接的图表从初始状态执行DFS。从此DFS期间发现的每个节点(initialState除外)执行另一个DFS,直到找到目标路径(仅使用前向链接)。

对于在DFS期间在后向链接上发现的每个节点u,路径为

path(initialState,u) ; path(u,finalState)

其中path(u,v)是相关DFS为此步骤找到的路径。
请注意,它可能会在某个u上多次调用 - 您可以为从initialStateu找到的每个路径调用它,因为它是不同的必需路径


如果您只需要路径数量,则可以使用topological sortDP更快地解决这个问题,但在此情况并非如此。