我遇到了如下问题:
我们有一个带有正边和负边的加权非循环图G(V, E)
代码。我们使用以下代码更改此图表的权重,以提供没有负边缘G
的{{1}}。如果(G')
和V={1,2...,n}
是边缘i到边缘j的权重。
G_ij
我们有两个公理:
1)G中每两个顶点之间的最短路径与G'相同。
2)G中每两个顶点之间的最短路径长度与G'相同。
我们要验证这两句话。哪一个是真的,哪一个是假的。谁可以添加一些提示为什么这些是真是假?
我的解决方案:
我认为两个是假的,如下面的反例所示,原始图形在左边给出,并且在算法运行之后,结果在右边1到3之间的最短路径改变,它从顶点2传递但是在算法运行它从未从顶点2传递。
答案 0 :(得分:2)
<强>假设:强>
您提出的问题存在一些问题;我做了一些假设,我在这里澄清一下。鉴于这些假设是正确的,您的问题的答案在下面的部分中。
首先,正如@amit所说,您对j
的使用尚不清楚。看来你的意思是:
Change_weight(G)
for i = 1 to n
c_i = min(c_ij) for all j
if c_i < 0
c_ij = c_ij-c_i for all j
c_ki = c_ki+c_i for all k
也就是说,对于每个顶点i
,如果最小的出口边c_i
为负,则将所有出局边的权重增加-c_i
并减少所有入边的权重按-c_i
。然后最小的输出边缘的权重为0。
第二,单独此算法不保证G'
没有负边!请考虑以下图表:
这里,(1,2)
上的操作将边1
的值向上推到0,但是2
上的操作将其推回到-1。您必须指定图表采用相反的拓扑顺序,以便在(i,j)
进行操作之前,j
始终会对边i
进行操作。 (或者,您可以按拓扑顺序对其进行排序,并从n to 1
进行迭代。)
回答您的问题:
1)G
中每两个顶点之间的最短路径与G'
中的最短路径相同。
这是事实。将路径视为边缘元组,而不是节点元组。对于顶点s
和t
,路径是节点(s, v_1, v_2, ..., t)
的元组,其中每两个后续元素之间存在边。对于每个顶点u
,u
以与增加传出边缘成本相同的速率降低了传入边缘的成本;因此,在路径中包含u
的相对成本不变。
2)G
中每两个顶点之间最短路径的权重与G'
中的相同。
这是错误的。来源s
将其传出权重增加-c_s
,而目标t
将其传入权重减少-c_t
。如果c_s != c_t
,则路径的权重将不相同。
重申一下,从s
到t
的每条路径的权重都会增加(c_t-c_s)
。因此,给定s
和t
对的最短路径仍然是最短的(因为该对之间的所有路径都改变相同的量)。但是,重量显然不一定相同。