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。谢谢