Acetyl
2021-04-12 11:58:21
首先,这题的
下面考虑调整这个
现在,对于每个格子
对于一个位置
但是目前矩阵中值的形式很不统一,既有
这样矩阵中所有的值都变成
这个差分约束模型中共有
附上考场上写的代码:
#include <bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
#define loop(i, a) for (int i = 0; i < (a); ++i)
#define cont(i, a) for (int i = 1; i <= (a); ++i)
#define circ(i, a, b) for (int i = (a); i <= (b); ++i)
#define range(i, a, b, c) for (int i = (a); (c) > 0 ? (i <= (b)) : (i >= (b)); i += (c))
#define pub push_back
#define pob pop_back
#define mak make_pair
#define mkt make_tuple
typedef long long ll;
typedef long double lf;
const int Inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
int T;
int n, m;
int a[305][305], b[305][305];
vector<pair<int, int> > egs[605];
bool inq[605];
int tms[605];
ll dis[605];
void solve() {
scanf("%d%d", &n, &m);
cont(i, n - 1) cont(j, m - 1) scanf("%d", a[i] + j);
memset(b, 0, sizeof(b));
range(i, n, 1, -1) range(j, m, 1, -1) b[i][j] = a[i][j] - b[i + 1][j] - b[i + 1][j + 1] - b[i][j + 1];
cont(i, n + m) egs[i].clear();
cont(i, n) cont(j, m) {
int mx = 1000000 - b[i][j], mn = -b[i][j];
if (!((i + j) & 1)) egs[j + n].pub(mak(i, mx)), egs[i].pub(mak(j + n, -mn));
else egs[j + n].pub(mak(i, -mn)), egs[i].pub(mak(j + n, mx));
}
deque<int> q;
memset(inq, 0, sizeof(inq));
memset(tms, 0, sizeof(tms));
memset(dis, Inf, sizeof(dis));
dis[1] = 0;
q.pub(1);
while (SZ(q)) {
int now = q.front(); q.pop_front();
++tms[now]; inq[now] = 0;
if (tms[now] > n + m) {
puts("NO");
return;
}
loop(i, SZ(egs[now])) {
int to = egs[now][i].first, siz = egs[now][i].second;
if (dis[to] > dis[now] + siz) {
dis[to] = dis[now] + siz;
if (!inq[to]) {
if (SZ(q) && dis[to] < dis[q[0]]) q.push_front(to);
else q.pub(to);
inq[to] = 1;
}
}
}
}
cont(i, n) cont(j, m) {
if ((i + j) & 1) b[i][j] -= dis[i];
else b[i][j] += dis[i];
if ((i + j) & 1) b[i][j] += dis[j + n];
else b[i][j] -= dis[j + n];
}
puts("YES");
cont(i, n) cont(j, m) printf("%d%c", b[i][j], " \n"[j == m]);
}
int main() {
freopen("matrix.in", "r", stdin);
freopen("matrix.out", "w", stdout);
scanf("%d", &T);
while (T--) solve();
return 0;
}