0

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

输入 :

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

输出:

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

我尝试了在给定行和列总和的情况下查找二进制矩阵是否存在中发布的解决方案

上述解决方案适用于小输入,但当输入约为 10 亿时,测试平台(如 codility)会超时。我需要一个比 o(m*n) 更好的解决方案。有人可以帮忙吗?

4

1 回答 1

1

您可以使用 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。

于 2019-05-30T01:40:18.833 回答