在有机图中查找循环

时间:2013-05-20 10:36:23

标签: c# detection cycle

我想在有机构建的图表中找到所有周期。简而言之,当两个分支或路径在公共顶点处结束时发生循环。像什么一样的东西 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 GivenAlgorithms to Identify All the Cycle Bases in a UnDirected Graph朝着正确的方向前进,但两个线程中没有提供有效的算法。

是否存在伪代码或实现形式的优化解决方案,还是应该倾向于任何提出的解决方案并自行优化?在后一种情况下,我应该为此提供代码样本吗?

期待您的回复。

2 个答案:

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