用队列TLE 75pts,而且超很多。 改成栈就成了很快,最后几个都是 100 多ms。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=310,V=1e6,M=N*N;//,Inf=1e9;
int h[N*2],e[M*2],ne[M*2],w[M*2],idx;
int A[N][N],B[N][N];
int row[N],col[N],tot;
LL d[N*2];
int pre[N*2];
bool st[N*2];
int T,n,m;
void add(int a,int b,int c)
{
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
stack<int> q;
bool spfa()
{
memset(d,0x3f,sizeof d),memset(pre,0,sizeof pre);
d[1]=0,st[1]=true,q.push(1);
while(q.size())
{
int u=q.top();q.pop();
st[u]=false;
if(pre[u]>=tot) return false;
for(int i=h[u];~i;i=ne[i])
{
int v=e[i];
if(d[v]>(LL)d[u]+w[i])
{
d[v]=(LL)d[u]+w[i];
pre[v]=pre[u]+1;
if(!st[v]) q.push(v),st[v]=true;
}
}
}
return true;
}
void solve()
{
memset(h,-1,sizeof h),idx=0;
cin>>n>>m;
tot=0;
for(int i=1;i<=n;i++) row[i]=++tot;
for(int i=1;i<=m;i++) col[i]=++tot;
for(int i=1;i<n;i++)
{
for(int j=1;j<m;j++)
{
cin>>B[i][j];
}
}
for(int i=n-1;i>=1;i--)
{
for(int j=m-1;j>=1;j--)
{
A[i][j]=B[i][j]-A[i+1][j]-A[i][j+1]-A[i+1][j+1];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if((i+j)&1)
{
add(row[i],col[j],A[i][j]);
add(col[j],row[i],V-A[i][j]);
}
else
{
add(col[j],row[i],A[i][j]);
add(row[i],col[j],V-A[i][j]);
}
}
}
if(!spfa()) cout<<"NO\n";
else
{
cout<<"YES\n";
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int v=(LL)d[row[i]]-d[col[j]];
if(!((i+j)&1)) v=-v;
A[i][j]+=v;
cout<<A[i][j]<<" ";
A[i][j]=0;
}
cout<<"\n";
}
}
}
signed main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>T;
while(T--) solve();
return 0;
}