令 G = (V,E,r) 一个有根有向图,由一组顶点 V 和一组边 E 与指定的根节点 r 定义。该图可能包含循环。任务:给定 V 中的两个顶点 x 和 y,找出从 x 到 y 的所有路径。
由于允许循环,因此路径集显然可能是无限的。因此,我想以正则表达式(Kleene Algebra)的形式找到一组路径。以下是一些示例:示例图表。乘法表示序列,因此路径 abc 表示首先 a,然后是 b,然后是 c。一组路径 a(b+c+d) 表示首先是 a,然后是 b、c 或 d。kleene 星 a* 表示 a 重复零次或多次,a+ 表示 a 重复一次或多次。
现在我正在寻找一种通过算法构造这些表达式的方法。到目前为止我想出了什么:
- 构造新的表达式树 T。
- 在结束节点 y 处开始搜索。
- 找到所有前辈 p 到 y。
- 对于每个 p:
- 将 p 作为子节点添加到 T 中的 y。
- 回溯从 p 到根的树上的路径。如果沿途找到 y,则从 y 到 p 存在一个循环。因此,不仅 p 是 y 的前身,而且 (path)* 也是 p 的前身。因此,将 (path)* 作为子节点添加到 p。
- 对于所有非循环的前辈,递归调用 y := p 作为新的结束节点。
最后:
- 反转树,使其以结束节点结束
- 将表达式树转换为表达式(直截了当)
不确定这是否可行,但是,我猜最坏情况的复杂性也会高于 2^n。有谁知道这个或类似问题的算法?