当前位置:  开发笔记 > 编程语言 > 正文

C#图遍历

如何解决《C#图遍历》经验,为你挑选了1个好方法。

该算法在遍历图中的节点方面做得很好.

Dictionary visited = new Dictionary();

Queue worklist = new Queue();

visited.Add(this, false);

worklist.Enqueue(this);

while (worklist.Count != 0)
{
    Node node = worklist.Dequeue();

    foreach (Node neighbor in node.Neighbors)
    {
        if (!visited.ContainsKey(neighbor))
        {
            visited.Add(neighbor, false);
            worklist.Enqueue(neighbor);
        }
    }
}

我可以用它来查找图中的目标节点.工作清单在处理工作清单时将项目列出(或弹出).找到目标后,如何返回节点的完整路径?

更新 我试图弄清楚如何反转根路径.在根节点上调用该方法,之后,子节点可能有两个父节点,因此它不像在每个节点上调用父属性并遍历备份那么简单.

该方法的目标是找到路径,而不是迭代所有节点,或检查节点是否存在.



1> Konrad Rudol..:

跟踪先前的节点.在最简单的实现中,这是一个字典,通常在伪代码中表示为π:

Dictionary visited = new Dictionary();
Dictionary ? = new Dictionary();

Queue worklist = new Queue();

visited.Add(this, false);

worklist.Enqueue(this);

while (worklist.Count != 0)
{
    Node node = worklist.Dequeue();

    foreach (Node neighbor in node.Neighbors)
    {
        if (!visited.ContainsKey(neighbor))
        {
            visited.Add(neighbor, false);
            ?.Add(neighbor, node);
            worklist.Enqueue(neighbor);
        }
    }
}

然后你可以遍历这些前辈来从任何节点回溯路径,比如说e:

while (?[e] != null) {
    Console.WriteLine(e);
    e = ?[e];
}

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有