问题描述
这是费力的案例工作:
- A
<B和0和N-1通过A->
琐碎连接。 - B
<A且0和N-1通过B->
平凡连接。 - B
<A且0和N-1通过A->
在仅具有K条边的图形上进行BFS连接。 - A
<B,0和N-1由B连接->
您可以检查O(N)是否存在长度为2 * A的路径(尝试中间的每个顶点)。
要检查其他路径长度,可以使用以下算法来达到目的:通过从0开始使用d个较短的边,使X(d)成为可到达的节点集。您可以使用以下算法找到X(d):取每个未知距离且迭代的顶点v从X(d-1)检查v和顶点之间的边。如果发现短边,则v在X(d)中,否则踩长边。由于最多有K个长边,因此您最多可以踩K次。因此,您应该在最多O(N+ K)的时间内找到每个顶点的距离。
解决方法
您将获得具有N个顶点的完整无向图。除K边以外的所有边的成本为A。您知道K边(作为对的列表)的成本为B。从节点0到节点N-1的最低成本是多少?
2 <= N <= 500k
0 <= K <= 500k
1 <= A,B <= 500k
问题显然是,当那些K边缘的成本高于其他K边缘,并且节点0和节点N-1通过K边缘连接时。
Dijkstra不起作用。我什至尝试过使用BFS进行类似的操作。
Step1: Let G(0) be the set of "good" adjacent nodes with node 0.
Step2: For each node in G(0):
compute G(node)
if G(node) contains N - 1
return step
else
add node to some queue
repeat step2 and increment step
问题在于,由于要发现每个“节点”必须从0到N-1进行循环才能找到“良好”的相邻节点,因此这会花费大量时间。
有谁有更好的主意吗?谢谢。
编辑:这是ACM竞赛的链接:http :
//acm.ro/prob/probleme/B.pdf