如何找出是否可以构造具有给定行和列总和的二进制矩阵

时间:2019-05-29 04:29:51

标签: binary tomography-reconstruction

如何确定是否可以构造具有给定行和列总和的二进制矩阵。

  

Havel-Hakimi定理(Havel 1955Hakimi 1962)指出存在一个矩阵 X n ,m 为0和1,行总计为 a 0 =( a 1 a 2 ,…, a n )和列总计 b 0 =( b 1 b 2 , …, b m ),这样 b i b i +1 ,如果且<0> i < m 仅当另一个矩阵 X n −1, m 的行总数为 a < / b> 1 =( a 2 a 3 ,…,< i> a n ),列总计为 b 1 =( b 1 −1, b 2 −1,…, b a < / i> 1 −1, b a 1 +1 ,…, b m )也存在。

我想这应该是递归确定问题的最佳方法。

用我自己的话来说:选择任意行,将其从总计列表中删除。呼叫删除的号码 k 。还从 k 列中减去一个大和。您可以获得一个较小矩阵的描述,然后递归。如果在任何时候您都没有 k 列的总和不为零,那么就不会存在这样的矩阵。否则,您可以使用相反的过程来递归地构建匹配矩阵:获取递归调用返回的矩阵,然后再添加一个包含 k 个行的行,并将其放在最初从其计数中减去1的列中。

实施

bool satisfiable(std::vector<int> a, std::vector<int> b) {
  while (!a.empty()) {
    std::sort(b.begin(), b.end(), std::greater<int>());
    int k = a.back();
    a.pop_back();
    if (k > b.size()) return false;
    if (k == 0) continue;
    if (b[k - 1] == 0) return false;
    for (int i = 0; i < k; i++)
      b[i]--;
  }
  for (std::vector<int>::iterator i = b.begin(); i != b.end(); i++)
    if (*i != 0)
      return false;
  return true;
}

给定的代码似乎不正确,因为在某些情况下它给出了错误的答案

0 个答案:

没有答案