【问题标题】:Simple cycle removing algorithm for a BGL graphBGL 图的简单循环去除算法
【发布时间】:2011-01-30 12:06:00
【问题描述】:

我的问题应该很简单,给定一个图表 (BGL adjacency_list) 是否有一个简单的算法来删除循环?我的第一次尝试是使用 DFS 访问者来检测关闭循环的边缘,然后将其删除,但我无法正确实现它。

有什么建议吗?最好有代码示例。

【问题讨论】:

    标签: algorithm boost graph cycle


    【解决方案1】:

    Boost 很棒。它有一个接受访问者的depth_first_search 方法。 You can see more information about it here.

    您需要做的就是实现这样的访问者:

    class CycleTerminator : public boost::dfs_visitor<> {
        template <class Edge, class Graph>
        void back_edge(Edge e, Graph& g) {
            //implement
        }
    };
    

    当然要记住,后边是闭合图中循环的边。

    【讨论】:

    • 漂亮、干净、优雅。我会接受这个,但我发现我实际上必须删除循环的所有边缘。我会为此打开一个新问题,因为它实际上改变了问题^^
    【解决方案2】:

    正如您所说,这是一个简单的 DFS。每次你来到一个你之前访问过的节点,都有一个循环。只需删除最后一条边即可。

    没有特定语言的伪代码。

    void walk(current_node, previous_node)
       if visited[current_node]
          remove edge between current_node and previous_node
          return
       end
    
       visited[current_node] = true
       for (each adjacent node) 
          walk(adjacent_node, current_node)
       end
    end
    

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 2021-12-20
      • 2021-03-16
      • 1970-01-01
      相关资源
      最近更新 更多