G - Millionaire Madness(bfs+优先队列)

题目: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;
}

上一篇:DNS简述


下一篇:洛谷 P1443 马的遍历