Subtask 1 只有 #3 过不去,求调或 hack
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e3+5,inf=2147483647;
int n,m,q;
vector<int>val[N];
struct Edge{
int to,value;
};
vector<Edge>G[N];
int dx[]={0,-1,0,1},dy[]={1,0,-1,0};
int num(int x,int y){
return (x-1)*m+y;
}
int dis[N][N];
struct node{
int x,y;
}nd[55];
signed main(){
cin.tie(0)->sync_with_stdio(0);
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
val[i].push_back(0);
for(int j=0,tmp;j<m;j++){
cin>>tmp;
val[i].push_back(tmp);
}
}
for(int i=1;i<=q;i++){
cin>>nd[i].x>>nd[i].y;
}
memset(dis,63,sizeof dis);
for(int i=1;i<=n*m;i++){
dis[i][i]=0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=0;k<4;k++){
int px=i+dx[k],py=j+dy[k];
if(px<1||py<1||px>n||py>m){
continue;
}
if(val[px][py]+val[i][j]<0){
cout<<"No\n"; return 0;
}
dis[num(i,j)][num(px,py)]=val[px][py];
dis[num(px,py)][num(i,j)]=val[i][j];
}
}
}
for(int k=1;k<=n*m;k++){
for(int i=1;i<=n*m;i++){
for(int j=1;j<=n*m;j++){
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
int minn=inf;
for(int i=1;i<=n*m;i++){
int maxx=-inf;
for(int j=1;j<=q;j++){
maxx=max(maxx,dis[num(nd[j].x,nd[j].y)][i]+val[nd[j].x][nd[j].y]);
}
minn=min(minn,maxx);
}
cout<<minn;
return 0;
}