注意判断能否跳出,并连接超级汇点时的条件
我原本这样写是错的
if (i - d < 1 || i + d > r || j - d < 1 || j + d > c) {
ADD(zip(i, j) + addition, S + 1, inf);
}
应当是以下两种之一或是等价的表达
if (i - d < 1 || i + d > r || j - d < 1 || j + d > c) {
ADD(zip(i, j) + addition, S + 1, inf);
}
if (std::min(std::min(i - 1, j - 1), std::min(r - i, c - j)) < d) {
ADD(zip(i, j) + addition, S + 1, inf);
}