我有一个有向图(更具体地说,一个控制流图),每个顶点都有一组属性。
我想找到(或写入)一个算法,在给定具有属性V
的顶点P
的情况下,找到到某个顶点E
的最长路径,这样<从all
到V
的{{1}}个可能路径中的em>所有顶点包含属性E
。
说我有以下图表。 (请原谅糟糕的ascii绘图。)
P
从 +----+
+--------+P +--------+
| +----+ |
| V1 |
| |
| |
+--v--+ |
+----+P ++ |
| +-----++ +--v--+
| | +----+P |
| | | +-----+
+--v--+ +--v--+ |
|P +-+ +-+P | |
+-----+ | | +-----+ |
| | |
| | |
+v-v--+ |
V6 |P +---------+ |
+-----+ | |
| |
| |
| |
| |
+-v--v-+
V7 |P |
+---+--+
|
|
+---v--+
V8 |!P |
+------+
开始,V1
始终在所有可能路径上保留的最长路径为P
- &gt; V1
。请注意其他路径,例如V7
- &gt; V1
,&#34;有效&#34;因为V6
总是成立,但是P
- &gt; V1
是最长的。
此示例与上述内容相同,但现在V7
未在P
中保留:
V3
在这种情况下,从 +----+
+--------+P +--------+
| +----+ |
| V1 |
| |
| |
+--v--+ |
+----+P ++ |
| +-----++ +--v--+
| | +----+!P | V3
| | | +-----+
+--v--+ +--v--+ |
|P +-+ +-+P | |
+-----+ | | +-----+ |
| | |
| | |
+v-v--+ |
V6 |P +---------+ |
+-----+ | |
| |
| |
| |
| |
+-v--v-+
V7 |P |
+---+--+
|
|
+---v--+
V8 |!P |
+------+
开始,V1
始终在所有可能路径中保留的最长路径为P
- &gt; V1
。路径V6
- &gt; V1
无效,因为V7
与V1
之间存在V7
不存在的路径。
是否有用于计算此类路径的标准算法?
答案 0 :(得分:3)
问题没有已知的有效解决方案,因为它很容易从Hamiltonian Path Problem缩小,它说 - 给定图表 - 是否有一条路径通过所有顶点一次?
减少很简单 - 给定哈密顿路径问题,用p
标记所有节点,并找到最长路径。由于哈密顿路径是NP-Complete,这个问题也是如此,并且没有已知的多项式解。
另一种方法是使用brute-force search(最简单的形式是生成所有排列并选择最有效的排列) - 但对于大型图形而言,这将变得不可能。您可能还需要考虑使用启发式方法(找到“好”解决方案,但不是最优解决方案),如遗传算法。
另一种可能的解决方案是将问题减少到Traveling Salesman Problem,并使用一些现有的TSP求解器。请注意,虽然这个问题也是NP难的,但由于它经过深入研究,因此对于中等大小的图形有一些非常有效的解决方案。
另外,如果你的图形恰好是“特殊的”(例如DAG),你可以利用一些智能技术来实现多项式时间的显着加速,如动态编程。