使用列表和堆栈对C#进行深度优先搜索
||
我想创建一个深度优先的搜索,该搜索已经取得了一定的成功。
到目前为止,这是我的代码(除我的构造函数外,请注意Vertex和Edge类仅包含属性,在此处没有重要内容可发布):
private Stack<Vertex> workerStack = new Stack<Vertex>();
private List<Vertex> vertices = new List<Vertex>();
private List<Edge> edges = new List<Edge>();
private int numberOfVertices;
private int numberOfClosedVertices;
private int visitNumber = 1;
private void StartSearch()
{
// Make sure to visit all vertices
while (numberOfClosedVertices < numberOfVertices && workerStack.Count > 0)
{
// Get top element in stack and mark it as visited
Vertex workingVertex = workerStack.Pop();
workingVertex.State = State.Visited;
workingVertex.VisitNumber = visitNumber;
visitNumber++;
numberOfClosedVertices++;
// Get all edges connected to the working vertex
foreach (Vertex vertex in GetConnectedVertices(workingVertex))
{
vertex.Parent = workingVertex;
workerStack.Push(vertex);
}
}
}
private List<Vertex> GetConnectedVertices(Vertex vertex)
{
List<Vertex> vertices = new List<Vertex>();
// Get all vertices connected to vertex and is unvisited, then add them to the vertices list
edges.FindAll(edge => edge.VertexSource == vertex && edge.VertexTarget.State == State.Unvisited).ForEach(edge => vertices.Add(edge.VertexTarget));
return vertices;
}
它以访问所有顶点的方式工作,但顺序不正确。
与维基百科相比,这是我的访问方式的比较:
它似乎是我的转身,并且是从右到左开始的。
你知道是什么原因吗? (此外,对于我的实施方案,我们将不胜感激)
编辑:我得到了答案,但仍想显示GetConnectedVertices方法的最终结果:
private List<Vertex> GetConnectedVertices(Vertex vertex)
{
List<Vertex> connectingVertices = new List<Vertex>();
(from edge in edges
where edge.VertexSource == vertex && edge.VertexTarget.State == State.Unvisited
select edge).
Reverse().
ToList().
ForEach(edge => connectingVertices.Add(edge.VertexTarget));
return connectingVertices;
}
没有找到相关结果
已邀请:
6 个回复
物崎巩
您返回的方法是什么?深度优先的一系列顶点。需要做些什么?起始顶点。好:
现在,我们有了一个深度优先搜索的简单实现;您现在可以使用Where子句:
好的,那么我们将如何实现该方法,以便在不破坏图形状态的情况下进行遍历?保持自己的外部状态:
看看那是多少更清洁和更短?状态无突变。不要与边缘列表混为一谈。没有名称不正确的助手功能。并且代码实际上按照其声明的方式运行:遍历图形。 我们还获得了迭代器块的好处;也就是说,如果有人将其用于DF搜索,则在满足搜索条件时将放弃迭代。如果我们尽早发现结果,则不必进行完整遍历。
babsoft
用法示例:
徘廷
中的
不保证元素顺序。您也不会以
方法
。让我们看一下这一行:
您应添加一个“ 14”以确保所需的顺序。
杭难插
屡倒雷图
抚驰