想象一个图表,其中每个顶点都有一个值(例如,石头数量)并通过边连接,表示在石头中穿过该边缘的成本。我想找到最大可能数量的宝石,这样每个顶点Vn> =这个值。顶点可以将石头交换给其他人,但交换的值会被距离或连接它们的边缘的重量减去
我需要将其解决为贪婪算法和O(n)复杂度,其中n是顶点数量,但我在识别子问题/贪婪选择时遇到问题。我希望有人可以提供踩踏石头或一些提示如何实现这一点,非常感谢
答案 0 :(得分:1)
我不确定我是否正确理解了这个问题,所以首先我要总结一下我的理解。
我们有一个顶点为v1,v2,..,vn和加权边的图。让vi和vj之间的权重为W [i,j]
每个顶点都以一些石头开头,让我们称顶点vi上的石头数量等于A [i]
您希望执行多次转移以最大化min的值(A [i]为i = 1..n)
x stone可以在vi和vj之间传输,如果x> w [i,j],此操作会将值转换为:
A[i] -= x A[j] += x-W[i,j] # Note fewer stones arrive than leave
这是对的吗?
我认为这个问题是NP难的,因为它可以用来解决3-SAT,这是一个已知的NP完全问题。
对于带有M子句的3-sat示例,例如:
(A+B+!C).(B+C+D)
构造一个有向图,其中每个子句都有一个节点(没有宝石),每个变量的节点有3M + 1个宝石,每个变量有两个辅助节点,一个石头(一个代表具有正值的变量) ,一个代表具有负值的变量。
然后按如下所示连接节点:
当且仅当3-sat可溶时,此图将具有所有顶点具有值> = 1的解决方案。
关键是每个红色节点(例如变量A)只能向A = 1或A = 0发送石头,但不能同时发送两者。如果我们为绿色节点A = 1提供石块,那么这个节点可以为所有使用该变量的蓝色条款提供宝石。
(您的原始问题不涉及有向图,但我怀疑这个额外的更改会对问题的复杂性产生重大影响。)
我担心找到这个问题的O(n)解决方案会非常困难。