【问题标题】:Get all vertices or edges in a found cycle of a graph获取图的找到循环中的所有顶点或边
【发布时间】:2015-11-16 02:54:25
【问题描述】:

我需要存储在图上找到循环的所有边或顶点。在网上搜索了两天后,我越接近发现代码不起作用:

struct CycleDetector : public dfs_visitor<> {
CycleDetector(std::vector<Vertex> p, std::vector<Vertex>& _cycle) : m_predecessor(p), cycle(_cycle)  { }

void back_edge(Edge e, Graph const& g)
{
    Vertex t = target(e, g);
    Vertex c = source(e, g);

    std::cout << "(" << t << "," << c << ")" << std::endl;
    std::cout << "Predecessor: " << m_predecessor[c] << std::endl;

    cycle.push_back(c);
    do {
        c = m_predecessor[c];
        cycle.push_back(c);
    } while(c != t);
}

protected:
std::vector<Vertex>& cycle;
std::vector<Vertex> m_predecessor;
};

int main()
{

//after a routine to create the graph and add_edges

std::vector<Vertex> cycle;
std::vector<Vertex> p(num_vertices(g1));
CycleDetector vis(p, cycle);

depth_first_search(g1, visitor(vis));

for (int i=0; i<cycle.size(); i++)
  std::cout << cycle[i] << ", ";
std::cout << std::endl;

这是程序的输出。这是一个最大度数为 2 的生成树。我在 E 和 H 顶点上添加一条边,以建议创建一个循环。我需要检测这个循环并返回形成它的所有顶点或边。

谢谢。

Output of the program

【问题讨论】:

  • 在你的示例中,你需要将Graph&amp; g作为Graph const&amp; g进行编译
  • 您好。我进行了更改,代码正在运行(有时是未定义的时间),但没有给出预期的结果。你能给我更多的帮助吗?我将发布程序的输出。

标签: cycle boost-graph undirected-graph


【解决方案1】:

经过大量搜索和尝试,我想我得到了我需要的东西。我创建了一个地图以将每个节点的父节点存储在深度优先搜索中。对于每个 tree_edge,我存储节点及其父节点。当调用 back_edge 时,我可以检测到一个循环,然后遍历父节点的映射。

希望对你有帮助

struct MyVisitor : default_dfs_visitor {
MyVisitor(EdgeSet& tree_edges, std::vector<Vertex>& _cycle) : tree_edges(tree_edges), cycle(_cycle) {}

void tree_edge(Edge e, const Graph& g) {
    std::cerr << "tree_edge " << e << std::endl;
    tree_edges.insert(e);
    Vertex t = target(e, g);
    Vertex c = source(e, g);
    m_predecessor[t] = c;


}
void back_edge(Edge e, const Graph& g) {
    if (tree_edges.find(e) == tree_edges.end()) {
        std::cerr << "back_edge " << e << std::endl;
        Vertex t = target(e, g);
        Vertex c = source(e, g);

        std::cout << "(" << name[t] << "," << name[c] << ")" << std::endl;

        cycle.push_back(c);
        do {
        c = m_predecessor[c];
        cycle.push_back(c);
        } while(c != t);
    }
}

private: 
   EdgeSet& tree_edges;
public:
   std::vector<Vertex>& cycle;
   map<Vertex, Vertex> m_predecessor;
};

int main() {

//routine that add the edges and other things

EdgeSet tree_edges;

std::vector<Vertex> cycle;
MyVisitor vis(tree_edges, cycle);
depth_first_search(g1, visitor(vis));

for (int i=0; i<cycle.size(); i++)
  std::cout << cycle[i] << ", ";
std::cout << std::endl;

谢谢!

【讨论】:

  • 当然,我希望如果有人能提供更好的方法来解决这个问题,请发布另一个我感兴趣的答案。
猜你喜欢
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多