检查是否可以创建二进制矩阵当给出每一行和每一列的总和时?

时间:2019-05-29 17:50:05

标签: algorithm matrix binary-matrix

给出矩阵中每一行和每一列的总和,检查是否可以创建二进制矩阵?

输入:

输入的第一行包含两个数字1≤m,n≤100000000,即矩阵的行数和列数。下一行包含m个数字0≤ri≤n–矩阵中每一行的总和。第三行包含n个数字0≤cj≤m–矩阵中每一列的总和。

输出:

如果存在一个m×n矩阵A(每个元素为0或1),则输出“ YES”。否则为“ NO”。

我尝试过发布在xlsxwriter documentation

中的解决方案

Above Solution可以很好地用于少量输入,但是当输入量为10亿个数量级时,诸如codility之类的测试平台就会超时。我需要一个比o(m * n)更好的解决方案。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您可以使用maxflow算法;该算法可在https://www.geeksforgeeks.org/ford-fulkerson-algorithm-for-maximum-flow-problem/等其他来源中使用。

对于这个问题,您必须制作一个4层的图形; 在第一个和第四个中仅使用一个节点,实际上它们是maxflow算法中的源和目标。

在第二和第三层中,您必须使用m和n节点,并且从一层到另一层的每个节点之间是一条边缘,其容量为= 1 这就是您在问题中命名的矩阵。

正如我们之前所说,在第二层中,我们有m个节点,所有节点都连接到第一个节点(maxflow算法中的源),权重就是您作为输入获得的权重。 对于第三个和第四个(目标节点),与m个节点和m个输入值相同。

运行算法后, 如果使用了所有节点的容量,那么您的答案是肯定的;如果否,您的答案是否定的。 为什么? 在您使用容量的任何地方,矩阵中都显示1,并且您需要全1,因此您的答案应该完整。 如您所见,在第二层的节点编号a和第三层的节点编号b之间,如果它在矩阵m中流动,则m [a] [b] = 1。