【发布时间】:2011-01-30 12:06:00
【问题描述】:
我的问题应该很简单,给定一个图表 (BGL adjacency_list) 是否有一个简单的算法来删除循环?我的第一次尝试是使用 DFS 访问者来检测关闭循环的边缘,然后将其删除,但我无法正确实现它。
有什么建议吗?最好有代码示例。
【问题讨论】:
标签: algorithm boost graph cycle
我的问题应该很简单,给定一个图表 (BGL adjacency_list) 是否有一个简单的算法来删除循环?我的第一次尝试是使用 DFS 访问者来检测关闭循环的边缘,然后将其删除,但我无法正确实现它。
有什么建议吗?最好有代码示例。
【问题讨论】:
标签: algorithm boost graph cycle
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
}
};
当然要记住,后边是闭合图中循环的边。
【讨论】:
正如您所说,这是一个简单的 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
【讨论】: