用spfa wa了,是spfa写错了吗?
查看原帖
用spfa wa了,是spfa写错了吗?
1178512
fire_hua楼主2024/10/4 10:39

wa 是spfa写错了吗?


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10,M=4e5+10,INF=0x3f3f3f3f;
int a[N];
int h[N],ne[M],e[M],w[M],idx;
int n,m,Q;
void add(int a,int b,int c){
	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
ll ans[N];
ll dis[N];
queue<int> q;
bool vis[N];
int x,y;
void spfa(int x)
{
	 for(int i=1;i<=n*m;i++)
	   dis[i]=INF,vis[i]=0;
	dis[x]=0;
	q.push(x);
	vis[x]=1;
	while(q.size())
	{
		int t=q.front();
		q.pop();
		vis[t]=0;
		for(int i=h[t];~i;i=ne[i])
		{
			int j=e[i];
			if(dis[j]>dis[t]+w[i])
			  {
			  	dis[j]=dis[t]+w[i];
			  	if(!vis[j])
			  {
			  	q.push(j);
			  	vis[j]=1;
			  }
			  }
		}
	  }  
	  for(int i=1;i<=n*m;i++)
	   ans[i]=max(ans[i],dis[i]+a[i]);
}
int main(){
	memset(h,-1,sizeof h);	
	cin>>n>>m>>Q;
	 int l=0;//linshi
	  for(int i=1;i<=n;i++)
	   for(int j=1;j<=m;j++)
	   {
	   	int t=m*(i-1)+j;
	   	  cin>>a[t];
	   	  
	   	  if(i>1)
		{
			l=t-m;
			if(a[l]+a[t]<0)
			{
				cout<<"No"<<'\n';
				return 0;
			}
			add(t,l,a[t]);
		}
		if(i<n)
		 add(t,t+m,a[t]);
		 
	   	if(j>1)
	   	  {
	   	  	l=t-1;
	   	  	if(a[l]+a[t]<0)
	   	  	{
	   	  		cout<<"No"<<'\n';
	   	  		return 0;
				 }
				 add(t,l,a[t]);
		}
		if(j<m)
		   add(t,t+1,a[t]);	
		   	
	   }
	 for(int i=1;i<=n*m;i++)
	  ans[i]=-INF; 
	if(Q==1)
	{		
		cin>>x>>y;
		cout<<a[m*(x-1)+y];
	}
	else{
		while(Q--)
		{		
			cin>>x>>y;
			spfa((x-1)*m+y);
		}
		ll minn=INF;
		for(int i=1;i<=n*m;i++)
		 minn=min(minn,ans[i]);
		 cout<<minn;
	}
	return 0;
}
2024/10/4 10:39
加载中...