rt,转化成类似全源最短路,但是超时了
#include <bits/stdc++.h>
using namespace std;
const int N = 505, M = 1e6 + 5;
int n, m, a[N][N];
vector<pair<int, int> > p;
int dis[M];
bool vis[M];
#define get(x, y) ((x - 1) * m + y)
struct Node
{
int x, y, maxn;
Node(int _x, int _y, int _m): x(_x), y(_y), maxn(_m){}
};
int dx[] = { 0, 0, -1, 1 };
int dy[] = { -1, 1, 0, 0 };
void spfa(int x, int y)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
dis[get(i, j)] = 0x3f3f3f3f;
}
}
queue<Node> q;
q.push(Node(x, y, 0));
dis[get(x, y)] = 0;
vis[get(x, y)] = 1;
while (q.size())
{
Node l = q.front();
q.pop();
vis[get(l.x, l.y)] = 0;
for (int i = 0; i < 4; i++)
{
int nx = l.x + dx[i], ny = l.y + dy[i];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m)
{
int diss = max(dis[get(l.x, l.y)], abs(a[nx][ny] - a[l.x][l.y]));
if (dis[get(nx, ny)] > diss)
{
dis[get(nx, ny)] = diss;
if (!vis[get(nx, ny)])
{
q.push(Node(nx, ny, diss));
vis[get(nx, ny)] = 1;
}
}
}
}
}
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
scanf("%d", &a[i][j]);
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
int x;
scanf("%d", &x);
if (x)
{
p.push_back(make_pair(i, j));
}
}
}
int ans = 0;
for (int i = 0; i < p.size(); i++)
{
//printf("%d: \n", i);
spfa(p[i].first, p[i].second);
for (int j = 0; j < p.size(); j++)
{
if (i == j) continue;
ans = max(ans, dis[get(p[j].first, p[j].second)]);
//printf("%d %d: %d\n", p[j].first, p[j].second, dis[get(p[j].first, p[j].second)]);
}
//system("pause");
}
printf("%d\n", ans);
return 0;
}