【问题标题】:How to get the MAX level(depth) of a vertex in a boost graph如何在提升图中获得顶点的最大级别(深度)
【发布时间】:2013-11-25 17:50:46
【问题描述】:

总的来说,我是提升图和图论的新手。碰巧的是,我对图算法术语的了解有限,这让我感到很困难。无论如何,这就是我想要做的。

我正在使用boost::adjacency_list,假设我有一个顶点

struct Node {
    int level;
}

现在我已经构建了一个完整的图,我想找到每个节点的级别。对我来说,级别在这里意味着节点距根的最大深度。例如考虑图(假设 118 是根节点)

118 -> 122
118 -> 120
122 -> 120
122 -> 121
121 -> 125
121 -> 123
123 -> 125
125 -> 124

然后是122 is 1, 120 is 2, 121 is 2, 123 is 3, 125 is 4, and 124 is 5的级别。

在 boost 中是否有任何算法可以让我做到这一点。我敢打赌它是boost::bredth_first_visit。但我不确定如何正确使用它,以便在访问时将正确的值放入Node.level

我在类似问题上发现了另一篇关于堆栈溢出的帖子,这是一种解决方案(它不适合我。)

typedef boost::property_map<TaskGraph, boost::vertex_color_t>::type color_map_t;
color_map_t colorMap; //Create a color map
boost::breadth_first_visit(graph, *boost::vertices(graph).first, boost::color_map(colorMap));

我想做的是像

boost::breadth_first_visit(graph, *boost::vertices(graph).first, /*What goes here so that Node.level gets the level*/);

感谢您的帮助,并对术语感到抱歉。不确定level 是否是图论中的正确术语。

【问题讨论】:

  • 如果“级别”的意思是“从根节点到节点的最大深度”,那么也许你可以解释到节点 123 的深度是 4,因为从根节点的唯一路径是 118 -> 122 -> 121 -> 123,看起来深度为 3...另外,当一个节点有多个路径时,我不确定“级别”是一个定义明确的概念...
  • 他可能是指成本最高的节点,每次遍历的成本为1。
  • @StevenMorad 是的,这正是我的意思。原帖有些问题。我现在已经编辑了。

标签: c++ algorithm boost graph


【解决方案1】:

看看Dijkstra's Algorithm。 没有简单的方法可以做到这一点, boost::breadth_first_visit 将遍历每个节点,但请记住,您仍然需要计算我将称为成本的“级别”。

假设你有这个图表:

   a->b
   b->c
   a->c

C 的“级别”是什么,二三级?在这里,您可能想改用“成本”一词。在这里,最小成本选项是 2。在这种情况下,如果每个 C 有两个父指针,则需要递归地遍历每个父指针备份起始节点,从而增加成本。

看起来像这样:

   cost=1
   c->b
       cost=2
       b->a
           cost=3 
   c->a
       cost=2

【讨论】:

  • +1。 Here 是一种使用 Boost.Graph 的“简单”方式。这假设 OP 想要最低成本,这意味着 120 的级别为 1(不是 2),而 cmets 中提到的 123 的级别为 3。
  • 感谢您的回答。我想我正在寻找的是从根节点到每个节点的最大成本。 @cv_and_he 代码找到了我认为的最低成本路径。无论如何感谢您的帮助。我想我找到了另一种方法来解决我的问题。至少我现在知道这些术语了。
  • @cv_and_he 能不能看看这个算法。 coliru.stacked-crooked.com/a/e17ea3006b8e2623 似乎从根节点到每个节点的路径最长或者成本最高。你能看到一些我应该注意的地方,这样我就不会认为它适用于所有情况?
【解决方案2】:

如果您正在寻找的是最长路径(您说“最大成本”),您应该注意以下几点:

与可以在没有负权重循环的图中在多项式时间内解决的最短路径问题相比,最长路径问题是 NP-hard,这意味着它不能在任意图的多项式时间内解决,除非 P = NP。

来自Wikipedia, longest path problem

如果您的图是一棵树(即如果它没有循环),那么最长路径等于最短路径,因为任何一对节点之间只有一条路径,并且您可以使用广度优先搜索,正如所指出的其他答案。

【讨论】:

    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    相关资源
    最近更新 更多