最短路径算法,其通过至少一个特定类型的顶点

时间:2017-09-29 07:37:04

标签: algorithm shortest-path

我有一个包含大约6500个顶点的图形,其中一些顶点有标签' c'。我需要设计一种算法,找到任意两个顶点之间的最短路径,其中包括这些顶点中的至少一个顶点' c'顶点。这很简单,但问题是所需的复杂度为O(ElogV),其中E是边数,V是顶点数。我已经使用min-heap实现了Dijkstra算法,所以我可以在O(ElogV)中找到一般的最短路径,但是我在解决问题时遇到了麻烦。有什么建议吗?

请注意,迭代地将Dijkstra从源码调用到c + c到目的地不属于复杂性限制,因为它最终为O(CElogV)

2 个答案:

答案 0 :(得分:1)

设G为你的图,顶点为v1 ... vn。

制作一个包含两个原始顶点副本的新图形:v1..vn,v1' .. vn'。在这个新的图表中,让vi和vj或vi之间存在边缘。和vj'如果原始图表中的vi和vj之间存在边缘。还要让vi和vj之间有一个优势。如果原始图表中的vi和vj之间存在边缘,则vj'标记为c。

然后,给定两个顶点vi,vj,vi和vj之间的最短路径。在新图中,是原始图中vi和vj之间的最短路径,它通过至少一个标记为c的顶点。

因为新图中顶点的数量加倍,并且边数最多为三倍,所以复杂度不会从O(VlogE)变化(其中V和E是顶点/边的数量)原图。)

答案 1 :(得分:0)

如果您有无向图:

说你正在寻找S和T之间的最短路径。

  • 使用Dijkstra算法
  • 找到从S到任何节点的所有最短路径
  • 找到从T到任何节点(相同算法)的所有最短路径
  • 遍历所有标记的节点c,并使用先前计算的最短路径找到最短路径 S到c与c到T 的组合。