我得到一个大小为N x M且N,M <= 100
的矩阵A.矩阵A由整数值A(i,j)组成,其中i和j是0 < i < M
和0 < 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)值也必须与给定的行和列总和相匹配。我想我必须使用最大流量,但我的尝试没有奏效。我怎样才能做到这一点?
答案 0 :(得分: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]&lt; = B [i,j]。你可以把它变换成A [i,j] - B [i,j]&lt; = C [i,j],这意味着B [i,j]是你需要从A [i减去的最小的东西] j]得到小于或等于C [i,j]的东西。从这里你知道你需要在矩阵A-B中的条目中添加一些内容。
现在让我们找到添加的内容和位置。
假设您获得以下行和列大小:
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).
现在让我们建立一个网络:
现在请注意,行的总和=列的总和。因此,您尝试推送“给定的条目总和”。 - &#39;当前的条目总数&#39;来自&#39;到了&#39;。
现在,让我们假设节点是由自然数从左到右枚举的。现在,当您将某个东西从第二级节点推送到第三级节点时,例如,您将某些东西从节点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]&lt; = B [i,j]仍然存在。