收集DAG的所有路径

时间:2013-01-31 17:41:45

标签: c# algorithm

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

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

其中ForwardStates是当前状态下的下一个状态列表。

我有两个特殊状态

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

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

List<List<string>> paths

例如,如下图所示

enter image description here

paths应包含该值 {{ “初始”, “一个”, “最终”},{ “初始”, “B”, “最后的”}}

如何在没有递归的情况下在C#中轻松实现这一点(因为图形可能很大)?

2 个答案:

答案 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);