我是新手,通常会提升图形和图论。事实上,我对图算法术语的了解有限,这对我来说很困难。无论如何,这是我想要做的。
我正在使用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
是否是图论中的正确术语。
答案 0 :(得分: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 :(得分:0)
如果您要查找的是最长路径(您说“最高费用”),您应该注意以下事项:
与可以在没有负权重循环的图中的多项式时间中求解的最短路径问题相比,最长路径问题是NP难的,这意味着它不能在任意图的多项式时间内求解,除非P = NP。
来自Wikipedia, longest path problem。
如果你的图是树(即它没有周期),那么最长路径等于最短路径,因为任何一对节点之间只有一条路径,你可以使用广度优先搜索,如指出的那样通过其他答案。