我的问题应该很简单,给定一个图形(BGL adjacency_list)是否有一个简单的算法去除周期?我的第一次尝试是使用DFS访问者来检测关闭循环的边缘然后将其删除但是我无法正确实现它。
有什么建议吗?代码示例最好。
答案 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