只有两个可能成本的完整图形从0到N-1的最短路径成本是多少

问题描述

这是费力的案例工作:

  1. A <B和0和N-1通过A->琐碎连接。
  2. B <A且0和N-1通过B->平凡连接。
  3. B <A且0和N-1通过A->在仅具有K条边的图形上进行BFS连接。
  4. 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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...