我有一个有向无环图,其中每个节点由状态
表示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
例如,如下图所示
其中后向链接用棕色虚线箭头表示 前向链接用黑色具体箭头表示, 可能的路径是 {{initial,b,a,final},{initial,c,final},{initial,b,initial,final}}
规则是从初始状态开始,它必须通过一个或多个反向链接,然后才能通过前向链接,一旦切换到前向链接,它将保持转发链接(即,它不能使用向后链接)。
这个问题是这个问题的延伸(Collecting all paths of DAG)。
答案 0 :(得分:2)
使用仅使用向后链接的图表从初始状态执行DFS。从此DFS期间发现的每个节点(initialState除外)执行另一个DFS,直到找到目标路径(仅使用前向链接)。
对于在DFS期间在后向链接上发现的每个节点u
,路径为
path(initialState,u) ; path(u,finalState)
其中path(u,v)
是相关DFS为此步骤找到的路径。
请注意,它可能会在某个u
上多次调用 - 您可以为从initialState
到u
找到的每个路径调用它,因为它是不同的必需路径
如果您只需要路径数量,则可以使用topological sort和DP更快地解决这个问题,但在此情况并非如此。