完整图中两个顶点之间的最短路径

时间:2014-04-16 01:36:14

标签: algorithm graph dijkstra

我有一个包含N个顶点的完整图形,我需要找到从给定源到给定目标的最短路径。所有边都有初始成本A,然后对于K边,成本将变为B.什么是找到顶点1和顶点N之间最小成本的最佳方法[算法找到顶点1之间的最低成本(即最短路径)和顶点N]?输入为N K A B和K边(成本为B的边)。

其中:

2 <= N <= 500000
0 <= K <= 500000
1 <= A, B <= 500000

我已经和Dijkstra一起尝试过了很长时间~2分钟,我需要2秒钟的时间。

1 个答案:

答案 0 :(得分:1)

  1. 如果1N之间的边缘费用为A

    1)如果A<B,则最低费用为A

    2)如果A>B,则使用BFS1N仅通过成本B的边缘找到最少的跃点。假设L1之间至少有N个边缘,然后返回min(LB,A)。通常为BFS,费用为O(N+K)

  2. 如果1N之间的边缘为B

    1)如果'A&gt; B',那么答案是B

    2)仅使用成本为1的边缘,从NA找到最少的跃点。让S[h]成为h hops可以到达的顶点集合,S'尚未到达集合,然后可以按如下方式解决。

    min_dis() { S[0] = {1}; int h = 0; S'={2,...,N}; while (S[h] is not empty) { S[h+1] = {}; for_each (v1 in S'){ for (v2 in S[h]) { if (cost[v1][v2] == A) { S[h+1].insert(1); S'.remove(v1); if (v1 == N) return min((h+1)*A, B); break; } } } h++; } return B; }

    我们可以证明此算法也是O(N+K),因为每次我们测试const[v1][v2]==Atrue时,S'的大小将减少1此测试为K时最多false次,因为最多K个边缘的费用为B。所以它保证完成O(N+K)

  3. 总的来说,算法为O(N+K),可以保证2sec时间限制。