【问题标题】:Check if it is possible to create a Binary Matrix When sum of each row and column is given?检查是否可以在给出每行和每列的总和时创建二进制矩阵?
【发布时间】:2019-10-15 09:22:35
【问题描述】:

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

输入:

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

输出:

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

我尝试了Finding if binary matrix exists given the row and column sums中发布的解决方案

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

【问题讨论】:

  • 我认为不存在。如果你找到了,一定要发表你的作品!
  • 是否有任何属性可以帮助缩小输入的大小?
  • 我在这里有点困惑,因为您上面给出的参数阻止输入的大小达到十亿左右(m * n 最多为一百万)。你能详细说明一下吗?
  • stackoverflow.com/questions/56308347/…。给出了一个算法及其在 C# 中的实现。

标签: algorithm matrix binary-matrix


【解决方案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 和第三层的 nember b 之间,如果它在您的矩阵 m 中有流动,则 m[a][b]=1。

【讨论】:

  • 你能详细说明一下吗?我不明白。
  • 你收到了吗?@Jack
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
相关资源
最近更新 更多