我想在有机构建的图表中找到所有周期。简而言之,当两个分支或路径在公共顶点处结束时发生循环。像什么一样的东西
1→2→3→4
1→5→4
形成1-> 2-> 3-> 4-> 5-> 1的循环。
由于图形的性质,我无法使用DFS或类似的算法,因为没有后沿。我发现Find All Cycle Bases In a Graph, With the Vertex Coordinates Given和Algorithms to Identify All the Cycle Bases in a UnDirected Graph朝着正确的方向前进,但两个线程中没有提供有效的算法。
是否存在伪代码或实现形式的优化解决方案,还是应该倾向于任何提出的解决方案并自行优化?在后一种情况下,我应该为此提供代码样本吗?
期待您的回复。
答案 0 :(得分:0)
我认为DFS适合你。
探索图表告诉您遇到已经探索过的顶点
这是伪代码:
function DFSFindCycle(Start, Goal)
push(Stack,Start)
while Stack is not empty
var Node := Pop(Stack)
Color(Node, Grey)
for Child in ExpandNotExploredEdges(Node)
if Node.color != White
return true
if Node.color = White
push(Stack, Child)
label edge e, Node:Child as explored
Color(Node, Black)
retrun false
希望有所帮助
答案 1 :(得分:0)
我有一个DFS使用示例输入,但每当我使用生成的图形作为输入时,它都找不到任何循环。也许你可以在这方面帮助我,因为我似乎陷入了逻辑黑洞。
请注意输入数据的排序方式如下: 顶点vert有零个或多个根顶点。
我正在查看以下伪代码:
nodes = dictionary(Vector2, Vertex)
vertices = GetData()
for each vertex in vertices
bBackEdge = false
//Check if vertex already exists
//If true, we got a back-edge
if nodes[vertex.Vector]
tempVertex = nodes[vertex.Vector]
bBackEdge = true
else
tempVertex = new Vertex(...)
nodes.add(tempVertex.Vector, tempVertex )
end of if
for each root in tempVertex.Roots
if nodes[root.Vector]
tempRoot = nodes[root.Vector]
tempRoot.Children.Add(vein)
if bBackEdge
vein.Children.Add(tempRoot)
end of if
end of if
end of for
end of for