BGL 图的简单循环去除算法
Posted
技术标签:
【中文标题】BGL 图的简单循环去除算法【英文标题】:Simple cycle removing algorithm for a BGL graph 【发布时间】:2011-01-30 12:06:00 【问题描述】:我的问题应该很简单,给定一个图表 (BGL adjacency_list) 是否有一个简单的算法来删除循环?我的第一次尝试是使用 DFS 访问者来检测关闭循环的边缘,然后将其删除,但我无法正确实现它。
有什么建议吗?最好有代码示例。
【问题讨论】:
【参考方案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
【讨论】:
以上是关于BGL 图的简单循环去除算法的主要内容,如果未能解决你的问题,请参考以下文章