use*_*739 7 algorithm graph shortest-path
我有一个有向图,看起来像这样:

我想找到从开始到结束最便宜的路径,其中橙色虚线都是路径有效所必需的.
自然最短路径是:开始 - > A - > B - >结束,结果成本= 5,但我们没有满足所有必需的边访问.
我想要找到的路径(通过一般解决方案)是开始 - > A - > B - > C - > D - > B - >结束,其中成本= 7,我们已经满足所有必需的边访问.
有没有人对如何要求这样的边缘遍历有任何想法?
令R为所需边的集合,且F = | R |。设G为输入图t(分别为s)为请求路径的起始点(分别为结束点)。
\n\n第一步是创建另一个图表。该图将恰好有F +2 个顶点:
\n\n要创建此图表,您必须执行以下操作:
\n\n构建此图的复杂度为O((F+2)\xc2\xb2.(E+V).log(V)),其中E(分别V)是原始图像中边(分别是顶点)的数量图形。
\n\n从这一点开始,我们必须在新创建的图中找到最短的哈密顿路径。不幸的是,这个任务是一个难题。我们没有比探索每一条可能的路径更好的方法了。但这并不意味着我们不能巧妙地做到这一点。
\n\n我们将使用回溯来执行搜索。我们可以通过维护两个集合来实现这一点:
\n\n在深入研究算法定义之前,先介绍一下主要思想。除了探索新图中可能路径的整个空间之外,我们别无选择。每一步,我们都必须做出决定:下一步我们该采取哪条优势?这会导致一系列决策,直到我们无法再移动或达到s为止。但现在我们需要回去取消决定,看看是否可以通过改变方向做得更好。要取消决定,我们按如下方式进行:
\n\n最终的算法可以这样总结:(我给出了一个迭代实现,人们可以找到一个更容易和更清晰的递归实现)
\n\n设K\xe2\x86\x90 []、L[0..R+1]\xe2\x86\x90[]和U\xe2\x86\x90 V (其中 V 是工作图中每个顶点减去起始和结束顶点t和s的集合)。最后让l\xe2\x86\x90 i\xe2\x86\x90 0 和best_path_length\xe2\x86\x90 \xe2\x88\x9e 和best_path\xe2\x86\x90[]
而(i\xe2\x89\xa5 0):
U\xe2\x89\xa0 []\nc\xe2\x86\x90 U.popFront()(我们取U的头)L[i].pushBack(c)i == R+1AND ( l== 权重( cur_path.back(), s ) + l) < best_path_length:\nbest_path_length\xe2\x86\x90lcur_pathK.tail()如果和之间有一条边 e c,并且weight(e)+ l< best_path_length:(如果K为空,则替换K.tail()为上一条语句中的t )\nK.pushBack(c)i\xe2\x86\x90 i+1l\xe2\x86\x90 weight(e)+lcur_path.pushBack(c)L[i]在末尾连接UL[i]\xe2\x86\x90[]i\xe2\x86\x90 i-1cur_path.popBack()在 while 循环 ( ) 结束时while (i \xe2\x89\xa5 0),best_path将保留最佳路径(在新图中)。从那里,您只需获取边的有效负载即可重建原始图中的路径。