Graph 在特殊条件下,如何寻找具有成本的最短路径?

Graph 在特殊条件下,如何寻找具有成本的最短路径?,graph,path,shortest,Graph,Path,Shortest,给定一个加权有向图G=(V,E),一个源顶点s,一个目标顶点t和一个子集V',如何在图中找到从s到顶点t的最短非循环路径?子集中的顶点必须包含在路径中。这是的一种变体 您可以通过运行图()中的“所有到所有”最短路径,然后创建一个新图,将问题转化为TSP的确切实例: G'={V' U {s,t}, E'} V' - the "must go through" subset E' = { (s,v), (v,t), (u,v) | u,v in V'} (In words: all edges b

给定一个加权有向图G=(V,E),一个源顶点s,一个目标顶点t和一个子集V',如何在图中找到从s到顶点t的最短非循环路径?子集中的顶点必须包含在路径中。

这是的一种变体

您可以通过运行图()中的“所有到所有”最短路径,然后创建一个新图,将问题转化为TSP的确切实例:

G'={V' U {s,t}, E'}
V' - the "must go through" subset
E' = { (s,v), (v,t), (u,v) | u,v in V'}  (In words: all edges between two nodes in the new graphs)
现在,在
G'
中找到通过所有节点(TSP)的模拟路径也是满足条件的最小路径(将两对之间的每条路径扩展回来之后)

不幸的是,TSP是一个问题(没有已知的多项式时间算法来解决它,大多数人认为它根本不存在),除非您的“必须通过节点”
V'
集相对较小(并且您可以负担算法的指数时间运行时间),否则您将需要选择一个“足够好”的算法,这可能不是最优的


关于“无循环”的旁注-注意可能不可行,例如:

      ---------
     |         |
     v         |
s -> a -> b -> c
     |
     |
     t

在这个例子中,满足条件的唯一路径是
s->a->b->c->t

谢谢你的回答。我对这个方法很感兴趣。但我有些怀疑。1.当我寻找所有到所有的最短路径时,如何保证每个路径都不同于其他路径(每个顶点只经过一次)。2.TSP问题是找到一条包含所有需求顶点的循环路径,对于这个问题,有什么需要改变典型的算法?@bigboxxx你不能保证没有循环,因为有像我上面提到的那样,没有没有没有循环的路径。体量是找到具有最小权重的路径,同时,每个需求顶点只能访问一次。现在,我使用Dijkstra查找最接近的需求顶点,然后从中查找最接近的一个。。。。但结果很差。你能给我一些建议吗?