Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 检查边值之和大于0的图形中是否存在包含某条边的循环_Algorithm_Graph - Fatal编程技术网

Algorithm 检查边值之和大于0的图形中是否存在包含某条边的循环

Algorithm 检查边值之和大于0的图形中是否存在包含某条边的循环,algorithm,graph,Algorithm,Graph,假设我们有一个无向图,其中每条边都有一个实数值。让我们将循环的“和”定义为该循环中每条边的值之和 是否有一种合理快速的方法来检查包含某条边E的图中是否存在循环,其中总和大于/小于0?现在,我的解决方案(极其粗糙且效率极低)是检查edge所处的每个周期 算法不需要找到一个精确的循环,它只需要检查是否存在这样的循环。假设您只允许简单的循环,不,没有有效的算法可以这样做,因为它可以让我们高效地求解。(换言之,这个问题是) 减少: (我们将使用你的问题的一个变体,我们将发现是否存在重量大于/等于零的简单

假设我们有一个无向图,其中每条边都有一个实数值。让我们将循环的“和”定义为该循环中每条边的值之和

是否有一种合理快速的方法来检查包含某条边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我不确定你的意思。任何有效循环都可以是正循环、零循环或负循环。