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;
}