用于BGL图的简单循环移除算法

时间:2011-01-30 12:06:01

标签: algorithm boost graph cycle

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

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

2 个答案:

答案 0 :(得分:5)

提升很棒。它有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
    }
};

当然记住后边缘是关闭图中循环的边缘。

答案 1 :(得分:0)

正如你所说,这是一个简单的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