Algorithm 检查边值之和大于0的图形中是否存在包含某条边的循环
假设我们有一个无向图,其中每条边都有一个实数值。让我们将循环的“和”定义为该循环中每条边的值之和 是否有一种合理快速的方法来检查包含某条边E的图中是否存在循环,其中总和大于/小于0?现在,我的解决方案(极其粗糙且效率极低)是检查edge所处的每个周期 算法不需要找到一个精确的循环,它只需要检查是否存在这样的循环。假设您只允许简单的循环,不,没有有效的算法可以这样做,因为它可以让我们高效地求解。(换言之,这个问题是) 减少: (我们将使用你的问题的一个变体,我们将发现是否存在重量大于/等于零的简单循环) 给定一个图Algorithm 检查边值之和大于0的图形中是否存在包含某条边的循环,algorithm,graph,Algorithm,Graph,假设我们有一个无向图,其中每条边都有一个实数值。让我们将循环的“和”定义为该循环中每条边的值之和 是否有一种合理快速的方法来检查包含某条边E的图中是否存在循环,其中总和大于/小于0?现在,我的解决方案(极其粗糙且效率极低)是检查edge所处的每个周期 算法不需要找到一个精确的循环,它只需要检查是否存在这样的循环。假设您只允许简单的循环,不,没有有效的算法可以这样做,因为它可以让我们高效地求解。(换言之,这个问题是) 减少: (我们将使用你的问题的一个变体,我们将发现是否存在重量大于/等于零的简单
G=(V,E)
,构建一个新的图:
G' = (V',E')
V' = V U {s,t}
E' = E U { (s,v), (v,t), (s,t) }
And add weights to the graph:
w(s,t) = -|V'| + 1
w(u,v) = 1 for u!=s and v!= t
直观地说,我们添加一个“源”和“目标”节点,将它们连接到所有其他节点,并使这两个节点以所有路径的负权重连接
还原将(G',(s,t))
发送到新算法
现在,如果原始图有哈密顿路径v1->v2->…->vn
,那么新图有一个循环s->v1->v2->…->vn->t->s
,其和为0,是一个简单的循环
如果在G'
中有一个简单的循环,它使用(s,t)
,并且总和大于0,那么它意味着除了(s,t)
使用的所有其他边的总权重至少为|V'|-1
。
从结构上看,这意味着在这个循环中确实有|V'
节点,这是整个图,所以我们知道这个循环是:s->t->v1->v2->…->vn->s
,因为这很简单,v1,v2,…,vn
是原始V
中的所有节点,这意味着有一个哈密顿路径v1->v2->…->vn
结论:我们已经展示了从哈密顿路径到你的问题的多项式时间缩减,而且由于HP是NP难的,这个问题也是。是否存在不涉及该边的负循环?@Davidisenstat我不确定你的意思。任何有效循环都可以是正循环、零循环或负循环。