代码见下面,只有50分
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
struct point{
int x,y;
};
point f[511][511];
point find(point xx){
if(xx.x==f[xx.x][xx.y].x&&xx.y==f[xx.x][xx.y].y)return xx;
f[xx.x][xx.y]=find(f[xx.x][xx.y]);
return f[xx.x][xx.y];
}
int n,m;
int a[511][511];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
point xu[250011];
int cnt=0,ans;
int main(){
cin>>n>>m;
int l=0,r=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
r+=a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int tmp;
scanf("%d",&tmp);
if(tmp==1){
cnt++;
xu[cnt].x=i,xu[cnt].y=j;
}
}
}
while(l<=r){
int mid=(l+r)/2;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
f[i][j].x=i,f[i][j].y=j;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=0;k<4;k++){
point tmp;
tmp.x=i+dx[k],tmp.y=j+dy[k];
if(tmp.x<1||tmp.x>n||tmp.y<1||tmp.y>m)continue;
if(abs(a[i][j]-a[tmp.x][tmp.y])<=mid){
point q=find(f[i][j]);
point p=find(f[tmp.x][tmp.y]);
if(p.x!=q.x||p.y!=q.y){
f[p.x][p.y]=q;
}
}
}
}
}
bool flag=0;
point biao=find(f[xu[1].x][xu[1].y]);
for(int i=2;i<=cnt;i++){
point tmp=find(f[xu[i].x][xu[i].y]);
if(tmp.x!=biao.x||tmp.y!=biao.y){
flag=1;
break;
}
}
if(flag==0){
r=mid-1;
ans=mid;
}else{
l=mid+1;
}
}
cout<<ans<<endl;
return 0;
}