看起来一道很神奇的题目,最后居然很想是最短路的……

大致题意:给你一个N*N的地图,然后每个格点的面积是1,图中标明了数字表示地形的海拔。初始的时候海拔低于0的地方都有水,然后告诉你在某一个固定的位置开一个不记大小的无底洞,水可以源源不断的流入。水流符合重力因素,现在问你最后的最多能从这个洞中流出多少水。

其实这题仔细想来,还是挺坑的,看起来像是一个简单的模拟,但是实际操作起来不那么简单。首先,知道那个开口的位置,很容易想到从开口位置开始进行广搜,拓展周围的点让水流下去。具体来说,只要开口位置周围的海拔低于0,那么就一定会有一定量的水流走,我们就要把该格点加入队列。而加入的点又要继续往后拓展,它旁边的点的水也要流走。为了这个过程的方便表示,我们对于每一个格点弄一个cur,表示该位置当前的水位高度,显然当此时的水位高度等于海拔高度的时候,该点就再也不用入队了。

但是呢,如果仅仅是这样简单的广搜,一个点多次入队,得到的结果会是一个TLE!于是就得考虑进行优化。我们考虑拓展的时候,对于同一个点C,如果A能够拓展到它,同时B也可以,但是B当前的深度更大,水位更低,那么显然我们优先从B拓展过来,因为如果从A过来,必会导致C的重复入队。那么我们优化的方法就出来了,每次对于队列中的所有点,我优先选择一个深度最大,水位最低的点来拓展,这样可以保证所有点都只会入队一次。再转过来想想,如此一来,这不就变成了一个类似于dijkstra的算法了吗?每次选取一个最优的点入队然后更新其他点,用一个优先队列取维护这个最优点。

就这样,我们再次看到了Dijkstra算法的巧妙与多变。具体见代码:

#include<bits/stdc++.h>
#define LL long long
#define lowbit(x) (x&-x)
#define N 510using namespace std;int X[8]={0,0,1,-1,1,-1,1,-1};
int Y[8]={1,-1,1,-1,-1,1,0,0};struct node
{int x,y,dep;bool operator <(node a) const{return dep>a.dep;}
};
int n,m,sx,sy,h[N][N],cur[N][N];
priority_queue<node> q;bool check(int x,int y)
{if (x>n||y>m||x<1||y<1) return 0;if (cur[x][y]==h[x][y]||h[x][y]>0) return 0;return 1;
}int main()
{while(~scanf("%d%d",&n,&m)){memset(cur,0,sizeof(cur));for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&h[i][j]);scanf("%d%d",&sx,&sy);cur[sx][sy]=h[sx][sy];LL ans=max(0,-h[sx][sy]);q.push(node{sx,sy,h[sx][sy]});while(!q.empty()){int x=q.top().x;int y=q.top().y;int w=q.top().dep;q.pop();if (w!=cur[x][y]) continue;for(int i=0;i<8;i++){int xx=x+X[i],yy=y+Y[i];if (check(xx,yy)&&cur[xx][yy]>cur[x][y]){ans+=cur[xx][yy]-max(cur[x][y],h[xx][yy]);cur[xx][yy]=max(cur[x][y],h[xx][yy]);q.push(node{xx,yy,cur[xx][yy]});}}}cout<<ans<<endl;}return 0;
}

计蒜客 Emptying the Baltic (BFS+Dijkstra)相关推荐

  1. 计蒜客:密码锁---bfs

    计蒜客:密码锁-bfs 题目描述: 现在一个紧急的任务是打开一个密码锁.密码由四位数字组成,每个数字从1到9进行编号.每次可以对任何一位数字加1或减1.当将9加1时,数字变为1,当1减1时,数字变为9 ...

  2. 计蒜客:迷宫(二)---bfs

    计蒜客:bfs求解迷宫游戏 题目描述: 蒜头君在你的帮助下终于逃出了迷宫,但是蒜头君并没有沉浸于喜悦之中,而是很快的又陷入了思考,从这个迷宫逃出的最少步数是多少呢? 输入格式 第一行输入两个整数 nn ...

  3. 计蒜客题解——T1214:鸣人和佐助

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1214. 题目描述 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到 ...

  4. 计蒜客题解——T1213:拯救行动

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1213. 题目描述 公主被恶人抓走,被关押在牢房的某个地方.牢房用 N×M(N,M≤200) 的矩阵来表 ...

  5. 计蒜客题解——T1769:最大岛屿

    题目相关 题目链接 计蒜客,https://nanti.jisuanke.com/t/T1405. 我的OJ,http://47.110.135.197/problem.php?id=5254. 题目 ...

  6. 计蒜客 2020 蓝桥杯大学 A 组省赛模拟赛 (一)题目及解析

    新手,欢迎交流,剩下D题不知如何下手,望大佬指教. 计蒜客 2020 蓝桥杯大学 B 组省赛模拟赛 (一)题目及解析 文章目录 A. 结果填空:计算周长 B. 结果填空:七巧板 C. 结果填空:苹果 ...

  7. 计蒜客题解——T1244:单词序列

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1244. 我的 OJ,http://47.110.135.197/problem.php?id=4766 ...

  8. 计蒜客题解——T1414:抠图

    题目相关 题目链接 计蒜客,https://nanti.jisuanke.com/t/T1414. 我的 OJ,http://47.110.135.197/problem.php?id=4768. 题 ...

  9. 坑!计蒜客——乳草的侵占

    计蒜客--乳草的侵占(BFS) BFS一直写不会,可能是多加了个队列,写起来不是太容易.不过最近还是稍微入门了BFS,跟DFS差别不太大,还是由三个部分组成--出口.标记.枚举. DFS的主要的思想就 ...

最新文章

  1. 【转】Flex4:利用HttpService与ASP.NET传输JSON数据(登录为例)
  2. 谈谈WEB开发中的苦大难字符集问题
  3. Java虚拟机规范(目录)
  4. 如何在进程间共享数据
  5. python3精要(10)-while,for
  6. Fedora 14 网卡设置
  7. lingo编程的主要方法_java并发编程 --并发问题的根源及主要解决方法
  8. 人脸识别最新进展——几篇相关论文总结
  9. react-native踩坑的开始!
  10. java中输出拼json,java poi 解析excel 输出json 并且拼接字符串显示到jsp
  11. 面向对象编程Sample(C#)
  12. 高度自定义的TabBarController 两个TableView之间的联动
  13. Java中frame和panel区别,JFrame 和JPanel 的关系-区别(学习笔记)
  14. 20145322何志威 《信息安全系统设计基础》第2周学习总结
  15. IntelliJ IDEA 12.0搭建Maven Web SSH2架构项目示例(二)
  16. python 之免费ip代理池
  17. 浅谈CAPM和因子模型
  18. 云服务器哪家好?阿里云国际版还是华为云国际版?
  19. ORA-39325 ORA-39112
  20. 安卓手机刷机liunx服务器_Android手机通用刷机教程,小白必看!

热门文章

  1. 没见面,未说话,TA却在风雨里更懂你
  2. String Art利用matlab用直线作画
  3. 处理前端开发浏览器字体小于12px方法
  4. Win10 Rational Rose 安装教程
  5. 迪杰斯特拉算法---求解最短路径
  6. Vue ElementUI 表单设计器 代码生成器
  7. linux使用iscsi配置共享存储
  8. java薪资水平_Java开发的薪资水平如何?
  9. int mysql是什么意思_MySQL数据类型 int什么意思
  10. 基于电压型磁链观测器的异步电机矢量控制学习