我有一个有向图(更具体地说,是一个控制流图),每个顶点都有一组属性。
我想找到(或编写)一个算法,给定一个V
带有 property的顶点P
,找到到某个顶点的最长路径,E
这样所有all
可能的路径上的顶点V
都E
包含 property P
。
示例 1
假设我有以下图表。(请原谅糟糕的ascii绘图。)
+----+
+--------+P +--------+
| +----+ |
| V1 |
| |
| |
+--v--+ |
+----+P ++ |
| +-----++ +--v--+
| | +----+P |
| | | +-----+
+--v--+ +--v--+ |
|P +-+ +-+P | |
+-----+ | | +-----+ |
| | |
| | |
+v-v--+ |
V6 |P +---------+ |
+-----+ | |
| |
| |
| |
| |
+-v--v-+
V7 |P |
+---+--+
|
|
+---v--+
V8 |!P |
+------+
从 开始,始终保持所有可能路径V1
的最长路径是-> 。请注意,其他路径,比如-> ,是“有效的”,因为它始终成立,但->是最长的。P
V1
V7
V1
V6
P
V1
V7
示例 2
这个例子和上面一样,除了现在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
V1
V6
V1
V7
V1
V7
P
关于我的情况的进一步说明
- 该图可以是循环的。
- 该图将是“小到中等”大小,可能有 1000 个或更少的顶点。
- 该图不一定总是有一个根和一个叶,就像我上面的例子一样。
问题
是否有计算此类路径的标准算法?