我有一个包含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秒钟的时间。
答案 0 :(得分:1)
如果1
和N
之间的边缘费用为A
。
1)如果A<B
,则最低费用为A
。
2)如果A>B
,则使用BFS从1
到N
仅通过成本B
的边缘找到最少的跃点。假设L
和1
之间至少有N
个边缘,然后返回min(LB,A)
。通常为BFS
,费用为O(N+K)
。
如果1
和N
之间的边缘为B
。
1)如果'A&gt; B',那么答案是B
。
2)仅使用成本为1
的边缘,从N
到A
找到最少的跃点。让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]==A
为true
时,S'
的大小将减少1
此测试为K
时最多false
次,因为最多K
个边缘的费用为B
。所以它保证完成O(N+K)
总的来说,算法为O(N+K)
,可以保证2sec
时间限制。