【问题标题】:Algorithms: Using maximum flow to calculate correct matrix values算法:使用最大流量计算正确的矩阵值
【发布时间】:2016-07-19 17:37:41
【问题描述】:

给定一个矩阵 A,大小为 N x M,N,M <= 100。矩阵 A 由整数值 A(i,j) 组成,其中 i 和 j 是 0 < i < M0 < j < N。我还得到了矩阵的“正确”列和和行和。给定的值 A(i,j) 是“不正确的”(它们与“正确的”总和不匹配),因此我们提供了相应的“不正确”值 B(i,j),其中 B(i,j) 范围从 0 到 A(i,j)。

目标是计算矩阵中“正确”的值 C(i,j),其中A(i,j) - C(i,j) =< B(i,j),C(i,j) 值也必须与给定的行和列总和匹配。我想我必须使用最大流量,但我的尝试没有奏效。我怎样才能做到这一点?

【问题讨论】:

  • 如果是网上某位评委,能否提供一下问题的链接?
  • 页面是荷兰语,很遗憾。
  • 这是来自正在进行的比赛吗? A 和 B 之间的确切关系是什么?
  • 你是对的;查看我的编辑。这不是持续的 - 我只是想练习。
  • 这是问题描述中的提示之一。 @Codor

标签: algorithm networking optimization matrix graph-theory


【解决方案1】:

这里我只是举个例子。

matrix A:
 10 10 10
 10 10 10
 10 10 10

matrix B:
  2  3  4
  5  6  4
  3  2  1

matrix A-B:
  8  7  6
  5  4  6
  7  8  9

所以你有公式 A[i,j] - C[i,j]

现在让我们找出要添加的内容和位置。

假设您有以下行和列大小:

c1 = 20/20
c2 = 19/21
c3 = 21/24

r1 = 21/21
r2 = 15/17
r3 = 24/27

上面我写的东西是这样的:

(current flow through column or row) / (goal flow through column or row).

现在让我们建立一个网络:

现在请注意,行的总和 = 列的总和。因此,您尝试将“给定的条目总和” - “当前的条目总和”从“s”推到“t”。

现在,让我们假设节点按自然数从左到右枚举。现在,当你从第二级节点向第三级节点推送一些东西时,比如说,你从节点 i 向节点 j 推送一些东西,你还将推送的任何东西添加到 NewMatrix[i,j],其中 NewMatrix 是矩阵 AB你得到你想要的矩阵。

还要注意,在开始时,在矩阵 AB 中,你有最小的 C[i,j],你必须从 A[i,j] 中减去它才能得到小于或等于 B[i,j] 的东西,现在您在 C[i,j] 中添加了一些东西,不等式 A[i,j]-C[i,j]

【讨论】:

  • 非常感谢。你已经为我澄清了,但我不太明白你在最后两段中的意思。如果我使用最大流量解决此图,我会找到一个我认为的数字,那么该数字意味着什么?
  • @user1760791 第二级图中的节点表示列,第三级表示行。如果您可以将流通过 c_i 推送到 r_j 然后到 t,那么您可以在位置 NewMatrix[i,j] 中添加该流量。得到它?更直观地说:如果您知道在 i 列中总和需要大 x 个单位,而在行 j 中需要大 y 个单位,那么您可以在 NewMatrix[i,j] 位置添加 min(x,y) 而无需矩阵无效。
  • @user1760791 也是,这是一个匹配问题。
  • 哎呀。我的意思是,第二层是行,第三层是列,但我猜应该没关系。
  • 您的解决方案似乎适用于我使用 2D 矩阵,如果我尝试更大的矩阵,它似乎会失败(如果有超过 2 个数字并且太多,x(总和差异)将会非常大将添加到 NewMatrix 中的第一个数字)。也许我误解了它?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 2023-04-11
  • 1970-01-01
  • 2011-09-09
  • 2017-06-14
相关资源
最近更新 更多