我用链式前向星跑spfa,TLE50分,改判负环方式和加快读未果,换成vector存图就能过,求助QWQ
代码:
#include<bits/stdc++.h>
using namespace std;
constexpr int maxn=1001;
constexpr int maxm=310;
constexpr int maxa=1000000;
inline namespace Graph {
struct edge {
int to,w;
};
vector<edge> E[maxn];
void insert(int u,int v,int w) {
E[u].push_back({v,w});
}
int sn,cnt[maxn];
long long dis[maxn];
bool vis[maxn];
bool spfa() {
memset(dis,0x3f,sizeof dis);
memset(cnt,0,sizeof cnt);
memset(vis,0,sizeof vis);
dis[0]=0;
queue<int> q;
q.push(0);
vis[0]=1;
cnt[0]++;
while(!q.empty()) {
int u=q.front();
q.pop();
//if(++cnt[u]>sn)return false;
vis[u]=0;
for(auto [v,w]:E[u]) {
if(dis[u]+w<dis[v]) {
dis[v]=dis[u]+w;
if(!vis[v]){
if(++cnt[v]>sn)return false;
q.push(v),vis[v]=1;
}
}
}
}
return true;
}
}
int a[maxm][maxm],b[maxm][maxm],n,m;
void limit(int a,int b,int c) {
//a-b<=c,d[v]-d[u]<=w(u,v)
insert(b,a,c);
}
void build() {
memset(a,0,sizeof a);
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];
for(int i=1;i<maxn;i++)E[i].clear();
sn=n+m;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if((i+j)&1) {
limit(i,j+n,maxa-a[i][j]);
limit(j+n,i,a[i][j]);
} else {
limit(j+n,i,maxa-a[i][j]);
limit(i,j+n,a[i][j]);
}
}
}
for(int i=1; i<=n+m; i++)insert(0,i,0);
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
scanf("%d %d",&n,&m);
for(int i=1; i<n; i++)for(int j=1; j<m; j++)scanf("%d",&b[i][j]);
build();
if(spfa()) {
printf("YES\n");
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if((i+j)&1)a[i][j]+=dis[i]-dis[j+n];
else a[i][j]+=dis[j+n]-dis[i];
printf("%d ",a[i][j]);
}
putchar('\n');
}
} else printf("NO\n");
}
return 0;
}