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 图的简单循环去除算法的主要内容,如果未能解决你的问题,请参考以下文章

图的割集,Boost Graph Library

关于图的一些寻路算法(课题有用)

去除最少边以强制增加未加权无向图中最短路径长度的算法

BGL(boost graph Library)(8-)

狄克斯特拉算法(图的最短路问题)

图的最小生成树——Prim算法