我有一个有向无环图,其中每个节点由状态
表示public class State{
List<State> ForwardStates;
string stateName;
}
其中ForwardStates
是当前状态下的下一个状态列表。
我有两个特殊状态
State initialState (name=initial)
State finalState (name=final)
我希望找到所有路径从初始状态开始到最终状态,并填入
List<List<string>> paths
例如,如下图所示
paths
应包含该值
{{ “初始”, “一个”, “最终”},{ “初始”, “B”, “最后的”}}
如何在没有递归的情况下在C#中轻松实现这一点(因为图形可能很大)?
答案 0 :(得分:2)
您的算法可能如下:
Tuple<State, List<String>>
。{ InitialState, new List<string> { InitialState.Name } }
{ ForwardState, DequeuedList.ToList().Add(ForwardState.Name) }
DequeuedList.ToList().Add(FinalState.Name)
添加到输出列表中。您应该根据需要最终得到一个空队列和一系列字符串列表。
答案 1 :(得分:1)
感谢您的评论,我也在这里使用这个建议 https://stackoverflow.com/a/9535898/1497720 (关键点是在BFS / DFS期间未使用访问状态)
以下是使用没有访问状态的DFS的版本
List<List<string>> paths= new List<List<string>>();
Stack<Tuple<State, List<string>>> working = new Stack<Tuple<State, List<string>>>();
working.Push(new Tuple<State,
List<string>>(initialNode,
new List<string> { initialNode.stateName }));
do
{
Tuple<State, List<string>> curr = working.Pop();
if (currNexts.stateName == "final")
{
res.Add(curr.Item2);
}
else
{
foreach (State currNext in curr.Item1.ForwardStates)
{
working.Push(new Tuple<State,
List<string>>(rnext, curr.Item2.Union(new[] { rnext.stateName }).ToList()));
}
}
} while (working.Count != 0);