【发布时间】:2022-01-21 11:14:30
【问题描述】:
我正在尝试通过下图查找所有路径:
start
/ \
c--A-----b--d
\ /
end
它只是非循环的,因为具有小写名称的顶点只能被访问一次,例如顶点d 不应被访问,因为要将其包含在通过图的路径中,顶点b 必须被访问两次。
通过图表的所有允许路径是:
start,A,b,A,c,A,end
start,A,b,A,end
start,A,b,end
start,A,c,A,b,A,end
start,A,c,A,b,end
start,A,c,A,end
start,A,end
start,b,A,c,A,end
start,b,A,end
start,b,end
几乎我所有的谷歌搜索结果都是针对有向图的,而我能找到的让它们适用于我的无向图的唯一方法是将每条边添加两次,每个方向一次,我认为这比我现在的更混乱,无效的解决方案。
我想出的最好的方法是递归遍历图:
private HashSet<List<Edge>> paths = new();
private List<Edge> _path = new();
HashSet<Vertex> smallsVisited = new HashSet<Vertex>();
private void Traverse(Vertex start)
{
var traverseEnd = GetVertexByName("end");
if (start == traverseEnd)
{
paths.Add(_path.ToList());
_path.Clear();
return;
}
if (smallsVisited.Contains(start))
return;
if (start.Name != "start" && char.IsLower(start.Name[0]))
smallsVisited.Add(start);
var traverseStart = GetVertexByName("start");
var neighbours = _adjacencyList[start].Where(v => v != traverseStart);
foreach (var end in neighbours)
{
_path.Add(new Edge(start, end));
Traverse(end);
}
}
我调用Traverse 并使用名为start 的顶点来设置流程滚动。当参数start 是名为end 的顶点时,我希望遍历停止,但结果只是一个路径,即顶点start 到顶点b。
我很新,只有几天,才能使用图表,并且对递归非常生疏。我做错了什么?
【问题讨论】:
-
你是
HashSet访问的小写字母顶点只存在一次递归。你真的想在整个路径遍历中保留它。 -
@juharr 我刚刚注意到并解决了这个问题,我想,谢谢。
标签: c# recursion graph-theory