如何确定是否可以构造具有给定行和列总和的二进制矩阵。
Havel-Hakimi定理(Havel 1955,Hakimi 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;
}
给定的代码似乎不正确,因为在某些情况下它给出了错误的答案