题目链接:http://codeforces.com/contest/821/problem/D

题意:n*m地图,有k个位置是点亮的,有4个移动方向,每次可以移动到相邻的点亮位置,每次站在初始被点亮某个位置,暂时使某行或该某列全部点亮,花费为1,下一次使用时,上一次暂时点亮被熄灭

题解:显然只要知道如果两点相邻直接相连然后就是极限情况,什么情况之下是两点是连不到一起的。如果x轴与y轴的相差大于2是连不到一起的。

具体画一下图就知道了。然后就跑一遍dij+优先队列就行了或者spfa也行。

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <queue>
  5. #include <cmath>
  6. #define inf 0X3f3f3f3f
  7. using namespace std;
  8. const int M = 1e4 + 10;
  9. typedef long long ll;
  10. ll dis[M];
  11. bool vis[M];
  12. int n , m , k , flag;
  13. struct TnT {
  14. int x , y;
  15. }T[M];
  16. struct qnode {
  17. int v;
  18. ll c;
  19. qnode(int v , ll c):v(v) , c(c) {}
  20. bool operator <(const qnode &r) const{
  21. return c > r.c;
  22. }
  23. };
  24. void dij() {
  25. priority_queue<qnode>q;
  26. memset(vis , false , sizeof(vis));
  27. q.push(qnode(1 , 0));
  28. dis[1] = 0;
  29. while(!q.empty()) {
  30. int u = q.top().v;
  31. q.pop();
  32. if(vis[u]) continue;
  33. vis[u] = true;
  34. for(int i = 1 ; i <= k ; i++) {
  35. int v = i;
  36. int dx = abs(T[u].x - T[v].x) , dy = abs(T[u].y - T[v].y);
  37. if(dx + dy == 1) {
  38. if(!flag && T[v].x == n && T[v].y == m) {
  39. if(dis[v] > dis[u] + 1 && !vis[v]) {
  40. dis[v] = dis[u] + 1;
  41. q.push(qnode(v , dis[v]));
  42. }
  43. }
  44. else {
  45. if(dis[v] > dis[u] && !vis[v]) {
  46. dis[v] = dis[u];
  47. q.push(qnode(v , dis[v]));
  48. }
  49. }
  50. }
  51. else {
  52. if(dx <= 2 || dy <= 2) {
  53. if(!flag) {
  54. if(T[v].x == n && T[v].y == m) {
  55. if(dx <= 1 || dy <= 1) {
  56. if(dis[v] > dis[u] + 1 && !vis[v]) {
  57. dis[v] = dis[u] + 1;
  58. q.push(qnode(v , dis[v]));
  59. }
  60. }
  61. }
  62. else {
  63. if(dis[v] > dis[u] + 1 && !vis[v]) {
  64. dis[v] = dis[u] + 1;
  65. q.push(qnode(v , dis[v]));
  66. }
  67. }
  68. }
  69. else {
  70. if(dis[v] > dis[u] + 1 && !vis[v]) {
  71. dis[v] = dis[u] + 1;
  72. q.push(qnode(v , dis[v]));
  73. }
  74. }
  75. }
  76. }
  77. }
  78. }
  79. }
  80. int main() {
  81. flag = 0;
  82. scanf("%d%d%d" , &n , &m , &k);
  83. for(int i = 1 ; i <= k ; i++) {
  84. scanf("%d%d" , &T[i].x , &T[i].y);
  85. if(T[i].x == n && T[i].y == m) flag = 1;
  86. dis[i] = inf;
  87. }
  88. if(!flag) {
  89. T[k + 1].x = n , T[k + 1].y = m;
  90. k++;
  91. dis[k] = inf;
  92. }
  93. dij();
  94. if(dis[k] >= inf) printf("%d\n" , -1);
  95. else printf("%lld\n" , dis[k]);
  96. return 0;
  97. }

codeforces 821 D. Okabe and City(最短路)的更多相关文章

  1. CodeForces 821D Okabe and City

    Okabe and City 题解: 将行和列也视为一个点. 然后从普通的点走到行/列的点的话,就代表这行/列已经被点亮了. 然后将费用为0的点建上边. 注意讨论(n,m)非亮的情况下. 代码: #i ...

  2. CF821 D. Okabe and City 图 最短路

    Link 题意:给出$n*m$大小的地图,已有$k$盏灯亮,人从左上角出发,右下角结束,期间必须走路灯点亮的地方,他可以在任意时刻消耗一枚硬币点亮一行或一列灯,他最多同时点亮一行或一列灯,要想点亮别的 ...

  3. CodeForces 173B Chamber of Secrets 二分图+最短路

    题目链接: http://codeforces.com/problemset/problem/173/B 题意: 给你一个n*m的地图,现在有一束激光从左上角往左边射出,每遇到‘#’,你可以选择光线往 ...

  4. Codeforces 787D. Legacy 线段树建模+最短路

    D. Legacy time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

  5. ACM学习历程—CodeForces 601A The Two Routes(最短路)

    题目链接:http://codeforces.com/problemset/problem/601/A 题目大意是有铁路和陆路两种路,而且两种方式走的交通工具不能在中途相遇. 此外,有铁路的地方肯定没 ...

  6. HDU-4849 Wow! Such City!,最短路!

    Wow! Such City!    题意:题面很难理解,幸亏给出了提示,敲了一发板子过了.给出x数组y数组和z数组的求法,并给出x.y的前几项,然后直接利用所给条件构造出z数组再构造出C数组即可,C ...

  7. 【codeforces 821E】Okabe and El Psy Kongroo

    [题目链接]:http://codeforces.com/problemset/problem/821/E [题意] 一开始位于(0,0)的位置; 然后你每次可以往右上,右,右下3走一步; (x+1, ...

  8. codeforces 601A The Two Routes(最短路 flody)

    A. The Two Routes time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  9. Codeforces 954D Fight Against Traffic(BFS 最短路)

    题目链接:Fight Against Traffic 题意:有n个点个m条双向边,现在给出两个点S和T并要增加一条边,问增加一条边且S和T之间距离不变短的情况有几种? 题解:首先dfs求一下S到其他点 ...

随机推荐

  1. Something wrong with EnCase v8 index search results

    My friend told me that she installed EnCase v8.05 on her workstation which OS version is Win 10. She ...

  2. RabbitMQ(四):使用Docker构建RabbitMQ高可用负载均衡集群

    本文使用Docker搭建RabbitMQ集群,然后使用HAProxy做负载均衡,最后使用KeepAlived实现集群高可用,从而搭建起来一个完成了RabbitMQ高可用负载均衡集群.受限于自身条件,本 ...

  3. ansible批量管理服务 上

    1 ansible简介 1.1 ansible批量管理服务概述 (1)是基于python语言开发的自动化软件工具(2)是基于SSH远程管理服务实现远程主机批量管理(3)并行管理,部署简单,应用也简单方 ...

  4. luogu1330_封锁阳光大学 图的遍历

    传送门 解释:(转自洛谷题解) 首先,肯定要明确一点,那就是这个图是不一定联通的.于是,我们就可以将整张图切分成许多分开的连同子图来处理.然而最重要的事情是:如何处理一个连通图? 乍看下去,似乎无从下 ...

  5. codeforces1088D_Ehab and another another xor problem交互题

    传送门 一道考验思维的交互题 大致思路就是从最高的二进制位向下询问 代入例子比如: 5 6 6 5 7 4 6 4 讨论一下 交互题的重点学会推理和归纳 #include <bits/stdc+ ...

  6. Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)

    简介 在网页中我们经常使用缩放操作来便利的查看具体的信息,在appium中使用MultiAction多点触控的类来实现.MultiAction是多点触控的类,可以模拟用户多点操作.主要包含加载add( ...

  7. Java中...的作用

    Java中...的作用,代表接收若干个相同类型的参数 public void testFunction(int...arr){    //接收若干个int类型的参数     for (int i:ar ...

  8. Vue系列:Websocket 使用配置

    WebSocket 是什么? WebSocket  是一种网络通信协议.而且是在 HTML5 才开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. 为什么需要 WebSocket ? 了解计算 ...

  9. 洛谷 P3413 SAC#1 - 萌数

    题意简述 求l~r之间存在长度至少为2的回文子串的正整数的个数 题解思路 数位DP 注意到有偶数长度的回文串必有长度为2的回文串,有奇数长度的回文串必有长度为3的回文串 所以只需判断与前一位,前两位是 ...

  10. EMCAscript6随心所记

    es6的支持情况http://kangax.github.io/compat-table/es6/ 1.let命令 基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变 ...