关于存图
查看原帖
关于存图
114368
wyw666楼主2022/3/30 22:00

我用链式前向星跑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;
}
2022/3/30 22:00
加载中...