我有一个包含大约6500个顶点的图形,其中一些顶点有标签' c'。我需要设计一种算法,找到任意两个顶点之间的最短路径,其中包括这些顶点中的至少一个顶点' c'顶点。这很简单,但问题是所需的复杂度为O(ElogV),其中E是边数,V是顶点数。我已经使用min-heap实现了Dijkstra算法,所以我可以在O(ElogV)中找到一般的最短路径,但是我在解决问题时遇到了麻烦。有什么建议吗?
请注意,迭代地将Dijkstra从源码调用到c + c到目的地不属于复杂性限制,因为它最终为O(CElogV)
答案 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之间的最短路径。