RT,差分约束 50pts TLE自闭了。
#include<cstdio>
#include<cstring>
#include<iostream>
const int V=1e6;
int read(){
int sum=0,sg=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')sg=-1;ch=getchar();}
while(ch>='0'&&ch<='9')sum=(sum<<1)+(sum<<3)+ch-'0',ch=getchar();
return sum*sg;
}
struct Edge{int from,to;long long val;}E[200010];
struct Queue{
static const int N=200000;
int hd,tl,sz,que[N+10];
Queue(){hd=1,tl=sz=0;}
void push(int x){++sz,tl=tl%N+1,que[tl]=x;}
void pop(){--sz,hd=hd%N+1;}
int front(){return que[hd];}
bool empty(){return !sz;}
}Q;
int T,n,m,S,eid,b[310][310];
long long a[310][310],dis[610];
bool BellmanFord(){
memset(dis,0x3f,sizeof(dis)),dis[S]=0;
for(int i=1;i<=n+m;++i)
for(int j=1;j<=eid;++j)
dis[E[j].to]=std::min(dis[E[j].to],dis[E[j].from]+E[j].val);
for(int j=1;j<=eid;++j)
if(dis[E[j].to]>dis[E[j].from]+E[j].val)return false;
return true;
}
int main(){
T=read();
while(T--){
n=read(),m=read();
for(int i=1;i<n;++i)
for(int j=1;j<m;++j)b[i][j]=read();
for(int i=1;i<=n;++i)a[i][1]=0;
for(int j=1;j<=m;++j)a[1][j]=0;
for(int i=2;i<=n;++i)
for(int j=2;j<=m;++j)a[i][j]=b[i-1][j-1]-a[i-1][j-1]-a[i-1][j]-a[i][j-1];
eid=S=0;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if(i&1 && j&1 || !(i&1) && !(j&1))E[++eid]={i,n+j,a[i][j]},E[++eid]={n+j,i,V-a[i][j]};
else E[++eid]={n+j,i,a[i][j]},E[++eid]={i,n+j,V-a[i][j]};
}
}
for(int i=n;i;--i)E[++eid]={S,i,0};
for(int j=m;j;--j)E[++eid]={S,n+j,0};
if(!BellmanFord())puts("NO");
else{
puts("YES");
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if(i&1 && j&1 || !(i&1) && !(j&1))printf("%lld ",a[i][j]+dis[i]-dis[n+j]);
else printf("%lld ",a[i][j]+dis[n+j]-dis[i]);
}
puts("");
}
}
}
return 0;
}