图表上的代码输出和本地竞赛的一些声明?

时间:2015-05-06 09:54:09

标签: c++ algorithm data-structures graph graph-theory

我遇到了如下问题:

我们有一个带有正边和负边​​的加权非循环图G(V, E)代码。我们使用以下代码更改此图表的权重,以提供没有负边缘G的{​​{1}}。如果(G')V={1,2...,n}是边缘i到边缘j的权重。

G_ij

我们有两个公理:

1)G中每两个顶点之间的最短路径与G'相同。

2)G中每两个顶点之间的最短路径长度与G'相同。

  

我们要验证这两句话。哪一个是真的,哪一个是假的。谁可以添加一些提示为什么这些是真是假?

我的解决方案:

我认为两个是假的,如下面的反例所示,原始图形在左边给出,并且在算法运行之后,结果在右边1到3之间的最短路径改变,它从顶点2传递但是在算法运行它从未从顶点2传递。

1 个答案:

答案 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'没有负边!请考虑以下图表:

Topologically sorted graph which breaks algorithm Change_weight(.)

这里,(1,2)上的操作将边1的值向上推到0,但是2上的操作将其推回到-1。您必须指定图表采用相反的拓扑顺序,以便在(i,j)进行操作之前,j始终会对边i进行操作。 (或者,您可以按拓扑顺序对其进行排序,并从n to 1进行迭代。)

回答您的问题:

1)G中每两个顶点之间的最短路径与G'中的最短路径相同。

这是事实。将路径视为边缘元组,而不是节点元组。对于顶点st,路径是节点(s, v_1, v_2, ..., t)的元组,其中每两个后续元素之间存在边。对于每个顶点uu以与增加传出边缘成本相同的速率降低了传入边缘的成本;因此,在路径中包含u的相对成本不变。

2)G中每两个顶点之间最短路径的权重与G'中的相同。

这是错误的。来源s将其传出权重增加-c_s,而目标t将其传入权重减少-c_t。如果c_s != c_t,则路径的权重将不相同。

重申一下,从st的每条路径的权重都会增加(c_t-c_s)。因此,给定st对的最短路径仍然是最短的(因为该对之间的所有路径都改变相同的量)。但是,重量显然不一定相同。