是否有一种算法可以在无向图中找到成本最高的长度为 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))。如果节点值足够不均匀,则分支定界可能会有所帮助。对于小的k
s,可能会转换为部分解决方案的图形。是否有关于图结构、值或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 的路径的主要内容,如果未能解决你的问题,请参考以下文章