#关于为什么要说这道题
TNND,在luogu上提交了6次才过
qwq,细节真的太重要了
#
##题目意思呢其实也挺好懂,一个起点,一个终点,可以用传送门,输出最短路
##因为每次移动距离都是w,实际上就是看看哪个先到达,哪个近,然后用BFS话还挺好做的
首先思路就是看下能不能直达,用ans存下
然后分别找下距离两个点最近的传送门,加起来与ans比较下,取小就行
#废话不多说,直接上AC代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<map>
#include<queue>
#include<vector>
#define endl "\n"
using namespace std;
typedef long long ll;
typedef vector<int> VI;
typedef vector<int,int>VII;
typedef pair<int,int> PII;
typedef double db;
const ll MOD = 998244353;
const ll inf = 0x3f3f3f3f3f3f3f3f;
const int maxn = 2005;
ll mp[maxn][maxn],vis[maxn][maxn];
int n,m;
ll w,ans;
struct point{int x;int y;//所在坐标及到达的距离ll step;//到这个点最短路bool operator<(const point&a)const{return step>a.step;}定义排序
}p;
ll dx[] = {1,0,0,-1};
ll dy[] = {0,1,-1,0};
priority_queue<point>v;
// ll gcd(ll a,ll b){ return b ? gcd(b,a%b):a;}
void BFS(int sx,int sy){queue<point>q;//申请队列memset(vis,0,sizeof(vis));//一定要初始化!!!qwqp.x = sx;p.y = sy;p.step = 0;q.push(p);  vis[sx][sy] = 1;while(!q.empty()){int x = q.front().x;int y = q.front().y;ll step = q.front().step;q.pop();if(x == n && y == m)ans = min(ans,step);因为改动后的BFS这里并没有返回,所以直达的ans取小if(mp[x][y]>0){p.x = x;p.y = y;p.step = step+mp[x][y];v.push(p);//可以到达的传送门}for(int i = 0;i<4;i++){int tx = x+dx[i];int ty = y+dy[i];if( vis[tx][ty] )continue;if(mp[tx][ty]!=-1 && tx<=n&&tx>=1&&ty<=m&&ty>=1){p.x = tx;p.y = ty;p.step = step+w;q.push(p);vis[tx][ty] = 1;}}}
}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr), cout.tie(nullptr);// memset(mp,-1,sizeof(mp));cin >> n >> m >> w;for(int i = 1;i<=n;i++)for(int j = 1;j<=m;j++)cin >> mp[i][j];// cin >> sx >> sy >> ex >> ey;//起终点BFS(n,m);ll a1 = -1;if(!v.empty())a1 = v.top().step;//离(n,m)最近的传送门在优先队列里面就是第一个了while(!v.empty())v.pop();清空vans = inf;//是否能直接到达BFS(1,1);// cout << ans << endl;ll a2 = -1;if(!v.empty()){a2 = v.top().step;//离(1,1)最近的传送门}// cout << a1 << endl;// cout << a2 << end;// cout << ans << endl;ll res = a1+a2;if(a1!=-1 && a2!=-1){if(ans != inf)res = min(ans,res);cout << res << endl;}else if(ans != inf)cout << ans << endl;else cout << -1 << endl;return 0;
}

其实注释已经很详细了,回头来看这道题其实还蛮简单的,但我还是不够细心,错了好多次,qwq,因此写下来提醒我自己,如果有任何不正之处,还请各位雅正。

CF1520G To Go Or Not To Go?相关推荐

最新文章

  1. Android 之 Fagment 完全解析
  2. python加法赋值运算符为_Python学习-算术运算符,赋值运算符和复合运算符
  3. 自动化C语言第一次月考试卷,145班《计算机组成与工作原理》第一次月考试卷...
  4. The way of Webpack learning (IV.) -- Packaging CSS(打包css)
  5. idea内存溢出解决_各种OOM代码样例及解决方法
  6. 关于js的一些常用小知识点(持续更新)
  7. 分享几个益智题......看你能做对吗?
  8. Linux系统如何连接和上传文件到服务器上
  9. HDOJ水题集合1:最小生成树(Kruskal)
  10. Java NIO框架Netty教程(二)
  11. Linux服务器的四种入侵级别
  12. Android事件分发理解
  13. 监听Solidity合约事件
  14. Python基础 - 20210425 - 基础(命名规范,注解,基础语法)
  15. 【12】Kotlin函数泛型协程
  16. 我的世界服务器无限刷东西指令,我的世界无限刷物品命令方块指令 | 手游网游页游攻略大全...
  17. Altium Designer初学者入门——stm32最小系统的PCB图(接上一篇原理图绘制)
  18. MySQL 求平均数
  19. 智能优化算法——粒子群算法原理(附代码)
  20. Unity中国象棋(一)——初始化棋子

热门文章

  1. 停车场的收费系统:停车场有3类汽车,每种收费也不一样,要求输入汽车类型和入库、出库时间,输出应交的停车费。假设停车时间不超过24小时。
  2. ThinkPad SL300/SL400/SL500 Vista Ultimate SP1 32位简
  3. 给双11想屯书的小伙伴一个书单
  4. 代理模式——红酒经销
  5. 学linux有什么用
  6. gor 流量录制 php 解析请求
  7. Pandas获取SQL数据库read_sql()函数及参数一文详解+实例代码
  8. understand 教程
  9. Lucene03---索引位置的优化(内存和磁盘配合使用)
  10. 如何实现4G DTU网关远程抄表方案