首页 > 其他分享 >POJ 2227 The Wedding Juicer(三维接雨水 BFS 贪心

POJ 2227 The Wedding Juicer(三维接雨水 BFS 贪心

时间:2022-10-05 22:01:02浏览次数:63  
标签:node BFS val Juicer 2227 最矮 yy int xx

POJ 2227 The Wedding Juicer(三维接雨水 BFS 贪心)

题意:

​ 给出一个二维地图,其各点上权值为其高度。如果向其中填水,请问在这张地图中可以积得多少水。

​ 地图长宽为300,高度最高为1e9。

999							
919										
989 以此图为例,可积水7		

思路:

​ 通过观察所给样例,可以发现,整个地图的储水量取决于最外围的最矮的点。若这个最矮的点被其周围比其高的点挡住,那边界就从这个最矮的点变成了其周围最矮的点。若最矮的点周围还有更矮的点,那他可以积的水为这两点的差值,同样更新一下边界。

​ 那么我们程序化这个过程,将最外一圈放入小根堆中,然后BFS扩展,根据两种情况来更新我们的边界,同时累积水。因为最矮的点是积水的短板,所以每次优先处理它。

实现:

​ 防重走,还有很坑爹的n和m是反的。

int n, m;
int a[305][305];
long long res = 0;
int d[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int vis[305][305];

struct node {
    int x, y, val;
    node(int x_, int y_, int _val) {x = x_, y = y_, val = _val;}
    bool operator < (const node &a) const {
        return val > a.val;
    }
};

int main()
{
    scanf("%d%d", &m, &n);
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
            scanf("%d", &a[i][j]);
    
    priority_queue<node> q;
    for(int i = 1; i <= n; i ++)
    {
        vis[i][1] = vis[i][m] = 1;
        q.push(node(i, 1, a[i][1]));
        q.push(node(i, m, a[i][m]));
    }
    for(int i = 2; i <= m - 1; i ++)
    {
        vis[1][i] = vis[n][i] = 1;
        q.push(node(1, i, a[1][i]));
        q.push(node(n, i, a[n][i]));
    }

    while(q.size())
    {
        node tmp = q.top();
        q.pop();

        for(int i = 0; i < 4; i ++)
        {
            int xx = tmp.x + d[i][0], yy = tmp.y + d[i][1];
            if(vis[xx][yy]) continue;
            if(xx > n || xx < 1 || yy > m || yy < 1)    continue;
            if(a[xx][yy] >= tmp.val)
                q.push(node(xx, yy, a[xx][yy]));
            else
                q.push(node(xx, yy, tmp.val)), res += (tmp.val - a[xx][yy]);
            vis[xx][yy] = 1;
        }
    }
    printf("%lld\n", res);
}

标签:node,BFS,val,Juicer,2227,最矮,yy,int,xx
From: https://www.cnblogs.com/DM11/p/16756533.html

相关文章

  • POJ 3697 USTC campus network(BFS 删边)
    POJ3697USTCcampusnetwork(BFS删边)题意:​ 有一张图,每个点\(n\le10000\)之间都有一条边。现在删去若干条边\(m\le1000000\),请问还有多少点是联通的。思路:​ 我......
  • POJ 2110 Mountain Walking(二分 枚举 BFS)
    POJ2110MountainWalking(二分枚举BFS)题目:​ 给出一张\(n*n(n\le100)\)的地图,每个点都有一个点权\((val\le110)\),可以任意选择路径,请问从(1,1)走到(n,n)的路......
  • 0-1 bfs 学习笔记
    01bfs是一种可以在\(\mathcal{O}(n+m)\)时间求解只含有\(0\),\(1\)两种边权的单源最短路的算法。这种情形下效率比dijkstra更高,和dijkstra一样好写(甚至更好写一......
  • 哥大周赛题目 0-1 Tree (BFS + 并查集)
    上周本地比赛,老wf选手都退役了,只剩我们这些22届本科升研究生来参赛了题目不是很难,11题,比之前的训练赛要简单很多,开场A了4题签到+1裸dp+1做过+1xjb乱搞。结果最后一......
  • ABC254E Small d and k(BFS)
    E-Smalldandk题目描述:  给\(n\)个顶点\(m\)条边的无向图,每个顶点的度不超过\(3\),给你\(Q\)次询问,每次询问给你一个顶点\(x\)和一个\(k\),表示求距离顶点\(x\)的长......
  • 【安全测试】移动端安全测试MobFS工具
    APP安全测试工具介绍:       MobSF(MobileSecurityFramework)是一款自动化移动App安全测试框架,适用于iOS和Android,可熟练执行动态、静态分析和WebAPI......
  • AcWing算法基础课---第三讲基础算法---01DFS和BFS
    DFSAcWing842.排列数字#include<iostream>usingnamespacestd;constintN=10;intn;intpath[N],st[N];voiddfs(intu){if(u==n){......
  • 【BFS】算法模板与思路
    1.BFS算法的基础理论是什么?BFS算法名叫宽度优先搜索,虽然我能理解深度优先搜索,但我却不是很能理解宽度优先搜索。一个很关键的点在于:宽度优先搜索是一个迭代的算法,不是递......
  • bfs和dfs基础
    #bfs&dfsgraph={"A":["B","C"],"B":["A","C","D"],"C":["A","B","D","E"],"D":["B","......
  • 广度优先搜索 BFS
    广度优先搜索BFS概念:广度优先搜索是连通图的一种遍历策略,从一个顶点开始,辐射状的优先遍历其周围较广的区域。模板:  ......