如何检查图中是否存在给定权重的路径

时间:2019-11-04 10:27:19

标签: algorithm graph

给出了一个加权的无方向图,检查在顶点1和n之间是否存在权重k的路径。

看起来像一个NP问题,但要求我在2秒内检查它,K为<= 10 ^ 18。 我们可以根据需要使用每条道路多次。 感谢您的帮助。

N和M非常小(<= 50),所以我考虑将dp用于权重最大为k的路径。 N,M,K是整数,边缘的权重<10 ^ 4。该图可能未连接 这个问题来自于代码部队培训,不幸的是,该声明不是英语的,因此附加该声明不会有任何用处。

  

一个国家有n个城市,城市的编号是1到n,所有道路都指向。每条道路连接两个城市。

     

沃克先生真的很喜欢散步。沿任何方向向任何方向行驶都需要w(i)分钟。沃克先生并没有待在城市,一到达一个城市,他便立即去另一个城市。

     

Walker先生从排名第一的城市开始,希望在整整K分钟内到达第n个城市。您需要检查是否可行。

     

输入-第一行包含两个整数n,m(1≤n,m≤50)。接下来的m条线描述了道路a(i)-开始,b(i)-结束,d(i)-沿着这条道路行驶所需的时间(1≤ai,bi≤n; 1≤di≤10 ^ 4)。

     

最后一行包含数字k-沃克先生希望其走的时间(1≤t≤10 ^ 18)。

     

如果可能的话,打印是可能的;如果沃克先生无法在准确的k分钟内到达第n个城市,则不可能。

1 个答案:

答案 0 :(得分:0)

请注意,我们可以对加权邻接矩阵进行矩阵求幂,以计算长度为 k 的路径的所有可能路径权重。这需要 O(n 3 log(k))时间。假设没有负权重,则矩阵 M k 中的所有条目都大于或等于 M k-1 < / em>。

现在,如果存在重量为 K 的路径,我们可以假定它必须具有一定的有限长度 k'。我们可以使用矩阵幂运算中最左上角的元素对 k'进行二进制搜索。结果是有效的 k'在左上角给出了 K ,这意味着我们完成了,找到了解决方案,或者二进制搜索告诉我们这样的 k'不存在,因此我们可以消除左上角。

对矩阵中的每个位置执行此操作,然后全部消除或找到解决方案。总复杂度为 O(n 5 log(k')),虽然不好,但这是一种算法。