我想知道是否有一个有效的算法S = F(v,G)来构造DAG G =(V,E)中的子图S,使得S中的所有路径都包含顶点v V.如果是这样,可以有效地将F扩展到F'(N,G)用于一组顶点N.我对最初存储DAG G的任何数据结构都是开放的。
实际上我忘记添加的一个条件是G有一个没有入边的唯一顶点r,并且路径必须是d是没有出边的顶点的形式。
我已经错过的另一个条件是给出扩展的F'(N,G),使得对于所有v,w,如果&n,则为r,..,v,..,w>其中w是接收器,那么我们应该忽略路径< r,..,v,..,x>其中x!= w。
我实际上有一个解决方案,但它不能扩展,当#V> 2000和#N> 2。
答案 0 :(得分:1)
我假设您正在寻找G =({r} + V + {d},E)的最大子图S,其中r是唯一的源节点,d是汇,这样每条路径从r到d传递特定节点v。
我建议的算法:
使用以下方法查找r和v之间的所有路径Find the paths between two given nodes?
查找v之间的所有路径并使用相同的算法。由于G是非循环的,因此从v到d的路径都不能返回到步骤1中已经找到的路径。因此,在结果图中,r和d之间的所有路径都将通过v。
答案 1 :(得分:1)
结果图包含可从v访问的节点,并且可以从(或转换子图中的v可到达的节点)访问节点v。获得可达节点集可以有效地完成。
对于一组节点,这可以很容易地扩展:您应该在广度优先搜索的开头添加它们。