求助spfa
查看原帖
求助spfa
332914
happybob楼主2022/8/5 13:50

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;
}
2022/8/5 13:50
加载中...