题目:https://vjudge.z180.cn/contest/423164#problem/G
题意:n*m的矩阵,每个点有一个高度,从(1,1)走到(n,m),若这个点比下一个点小,拿*补上差,求需要的最小*。
题解:bfs跑一遍,并且用优先队列存下来,每次取出最小的那个差,直到(n,m)这个点,这样这条路上用的*最短。
#include <iostream>
#include<bits/stdc++.h>
typedef long long ll;
const int N = 1005;
using namespace std;
struct node
{
int x, y, val;
bool operator <(const node &a)const
{
return a.val < val;
}
};
int maxx;
int n, m;
int a[N][N];
int vis[N][N];
int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};
void bfs()
{
priority_queue<node>q; //用来取出最小的差
q.push((node)
{
1, 1, 0
});
while (!q.empty())
{
node temp = q.top();
q.pop();
if (vis[temp.x][temp.y] == 1)continue; //如果这个点走过就不用再走了
vis[temp.x][temp.y] = 1; //标记这个点走过
maxx = max(maxx, temp.val);
if (temp.x == n && temp.y == m)return;
for (int i = 0; i < 4; i++)
{
int tx = temp.x + dx[i];
int ty = temp.y + dy[i];
if (tx < 1 || ty < 1 || tx > n || ty > m)continue;
if (vis[tx][ty] == 0) //如果这个点没有走过加入这个点,后面可能会走
{
q.push((node)
{
tx, ty, max(0, a[tx][ty] - a[temp.x][temp.y])
});
}
}
}
}
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]);
}
}
bfs();
printf("%d\n", maxx);
return 0;
}