C# 使用Ford Fulkerson确定足以求和的值的二部图中的最大流

C# 使用Ford Fulkerson确定足以求和的值的二部图中的最大流,c#,matrix,max,flow,ford-fulkerson,C#,Matrix,Max,Flow,Ford Fulkerson,我在想,在这种情况下,我应该如何使用福特-富尔克森算法,这种情况有点像数独游戏。我们有一个包含整数值的矩阵a。每行的最后一列和每列的最后一行包含整行/整列的总和 例如: int[][] a = {{1, 3, 5, 9}, {4, 2, 1, 7}, {5, 5, 6, *}} // * Is not determined since the sums // * do not count

我在想,在这种情况下,我应该如何使用福特-富尔克森算法,这种情况有点像数独游戏。我们有一个包含整数值的矩阵
a
。每行的最后一列和每列的最后一行包含整行/整列的总和

例如:

int[][] a = {{1, 3, 5, 9},
             {4, 2, 1, 7},
             {5, 5, 6, *}} // * Is not determined since the sums 
                           // * do not count as summable values.
问题是,矩阵中的值并不总是正确的。总和的值并不总是正确的,例如:

int[][] a = {{1, 3, 3, 9},
             {2, 3, 1, 7},
             {5, 5, 6, *}} // * Is not determined since the sums do 
                           // * not count as summable values.
有一个矩阵
b
,其中包含一个单元格必须满足给定总和的最大差值。比如说

int[][] b = {{1, 0, 3},
             {2, 1, 2}}
例如,对于
a[0][0]
的值,它是1,最大差异是
b[0][0]
的值,它是1,因此
a[0][0]
的值可以更改为0或2最大值(以及介于两者之间的所有数字,但对于本例,我们只有2个选项)

我的问题是:给定一个矩阵
a
(对于给定的和,其值无效)和一个矩阵
b
,其最大差异可用于满足所需的和,我如何确定给定的最大差异是否可能,以及如何获得此类矩阵的有效结果(如果存在)

我目前的方法(不可行):

  • 制作一个行和列的二分图,这样每一行和列都有一个源、一个汇和一个节点
  • 然后将每行连接到每列
  • 然后将源连接到每一行
  • 然后将每个柱连接到水槽
  • 将从源节点到每行节点的边的容量设置为Math.Abs(当前
    a
    中的数字总和-给定
    a
    中的数字总和(针对该行))
  • 从每个列节点到接收器的边相同(但这次的列和)
  • 相应地,将每个单元格的行到列的节点之间的容量设置为
    b
    中给定的最大差值
  • 使用Ford Fulkerson确定最大流量

我不知道应该如何使用算法的结果来确定矩阵
a
的正确值,以满足每行和每列的给定总和

所以我自己找到了解决这个问题的方法:

如果有值矩阵
A[i][j]
和差异矩阵
B[i][j]
,则必须为每个
i
j
减去
A
-
B
。然后,您必须使用行作为左节点,列作为右节点来创建一个二部图

然后必须将每个行节点连接到列节点,反之亦然。还要将源连接到所有行节点,并将所有列节点连接到接收器

从源节点到行节点的每条边的容量是当前数字的总和,而要接收的列节点的边容量也是如此

行节点和列节点之间的每个容量都是当前的
B[i][j]
*2。那么你应该有一个完整的网络

使用福特富尔克森和爱德蒙卡普。每个行节点和列节点之间的流是应添加到当前
A[i][j]
的数字


您得到的
矩阵将是您的答案

@Smandoli谢谢你,我已经编辑了标签。有人能帮我吗?是最大差异还是绝对最大差异?我检查一下tonit@norisknofun这是最大的区别。如果给定的最大差值是4。差异可能为1、2、3和4。谢谢