是否有一种算法可以在无向图中找到成本最高的长度为 k 的路径

Posted

技术标签:

【中文标题】是否有一种算法可以在无向图中找到成本最高的长度为 k 的路径【英文标题】:Is there an algorithm for finding the path of length k with the highest cost in a undirected graph 【发布时间】:2022-01-18 18:53:27 【问题描述】:

我已经考虑这个问题几个星期了,但无法找到一个有效的解决方案。

所以基本上想象你有一个无向图,其中每个节点都有一个分配给它的值(只有正值)。我想找到一条长度为 k 的路径(开始和结束节点无关紧要),如果您将访问节点的值相加,则该路径具有最高的“成本”。您只能访问一次节点。

我们以这张图为例:

    d
    |
a - b - c
|   |
e - f

使用以下节点值:

a: 5
b: 10
c: 2
d: 3
e: 6
f: 7

长度 k=3 的成本最高的路径是 e-f-b,因为总和是 23。

我找到了一个解决方案,可以在 O(n^k) 时间内解决这个问题,基本上找到每个节点的所有可能路径,然后找到成本最高的路径,但我认为必须有一个更优化的解决方案。

【问题讨论】:

重访节点可以吗? 另外,负值可能吗? @Marat 不允许重新访问节点,这也是我一直在努力解决的问题。负值也是不可能的。 这是一个 NP-hard 问题,因此没有简单的解决方案。在一般情况下,中间相遇会给出 O(n^(k/2))。如果节点值足够不均匀,则分支定界可能会有所帮助。对于小的ks,可能会转换为部分解决方案的图形。是否有关于图结构、值或k 的任何基本假设? 【参考方案1】:

Step1 将成本分配给节点是很尴尬的。 Dijsktra 算法期望成本在链接上。因此,将节点转换为链接并将链接转换为节点会很好

(a,cost ac) -> (b,cost bc)

变成

() - cost ac > () - cost bc > ()

Step2 Dijsktra 计算成本最低的路径。所以你已经重新计算了每一个成本

c = max cost - c

Step3 现在你可以使用 Dijkstra 找到最昂贵的路径

LOOP n1 over nodes
    Dijsktra
    LOOP n2 over nodes starting at n1 + 1
       IF n1 to n2 most expensive so far
           Save n1 to n2

【讨论】:

以上是关于是否有一种算法可以在无向图中找到成本最高的长度为 k 的路径的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种算法可以在分离源和汇的无向图中找到最小割

在具有特定成本的无向图中查找路径

具有动态边缘成本的最短路径(算法)

CSU 1660 K-Cycle(dfs判断无向图中是否存在长度为K的环)

在图中找到一个简单循环并打印它的算法

麻烦问下各路大牛 怎么求无向图中的最小环长度? 万分感谢