为啥spfa用栈比队列快很多?
查看原帖
为啥spfa用栈比队列快很多?
525375
Richard_Whr楼主2024/8/8 09:25

用队列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;
}
2024/8/8 09:25
加载中...