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

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

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

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

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cmath>
#define inf 0X3f3f3f3f
using namespace std;
const int M = 1e4 + 10;
typedef long long ll;
ll dis[M];
bool vis[M];
int n , m , k , flag;
struct TnT {
int x , y;
}T[M];
struct qnode {
int v;
ll c;
qnode(int v , ll c):v(v) , c(c) {}
bool operator <(const qnode &r) const{
return c > r.c;
}
};
void dij() {
priority_queue<qnode>q;
memset(vis , false , sizeof(vis));
q.push(qnode(1 , 0));
dis[1] = 0;
while(!q.empty()) {
int u = q.top().v;
q.pop();
if(vis[u]) continue;
vis[u] = true;
for(int i = 1 ; i <= k ; i++) {
int v = i;
int dx = abs(T[u].x - T[v].x) , dy = abs(T[u].y - T[v].y);
if(dx + dy == 1) {
if(!flag && T[v].x == n && T[v].y == m) {
if(dis[v] > dis[u] + 1 && !vis[v]) {
dis[v] = dis[u] + 1;
q.push(qnode(v , dis[v]));
}
}
else {
if(dis[v] > dis[u] && !vis[v]) {
dis[v] = dis[u];
q.push(qnode(v , dis[v]));
}
}
}
else {
if(dx <= 2 || dy <= 2) {
if(!flag) {
if(T[v].x == n && T[v].y == m) {
if(dx <= 1 || dy <= 1) {
if(dis[v] > dis[u] + 1 && !vis[v]) {
dis[v] = dis[u] + 1;
q.push(qnode(v , dis[v]));
}
}
}
else {
if(dis[v] > dis[u] + 1 && !vis[v]) {
dis[v] = dis[u] + 1;
q.push(qnode(v , dis[v]));
}
}
}
else {
if(dis[v] > dis[u] + 1 && !vis[v]) {
dis[v] = dis[u] + 1;
q.push(qnode(v , dis[v]));
}
}
}
}
}
}
}
int main() {
flag = 0;
scanf("%d%d%d" , &n , &m , &k);
for(int i = 1 ; i <= k ; i++) {
scanf("%d%d" , &T[i].x , &T[i].y);
if(T[i].x == n && T[i].y == m) flag = 1;
dis[i] = inf;
}
if(!flag) {
T[k + 1].x = n , T[k + 1].y = m;
k++;
dis[k] = inf;
}
dij();
if(dis[k] >= inf) printf("%d\n" , -1);
else printf("%lld\n" , dis[k]);
return 0;
}

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. 2019前端面试系列——JS高频手写代码题

    实现 new 方法 /* * 1.创建一个空对象 * 2.链接到原型 * 3.绑定this值 * 4.返回新对象 */ // 第一种实现 function createNew() { let obj ...

  2. Docker——理解好镜像和容器的关系

    关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料.  镜像也是 docker 的核心组件之一,镜像时容器运行的基础,容器是镜像运行后的形态.前面我们介绍了 ...

  3. Android buildType混淆代码

    [话题引入] ①在Android开发完成,我们会将代码打包成APK文件.选择 菜单栏 Build --> Build APK ②将查看视图切换到 Project 模式,文件夹下有一个debug模 ...

  4. Servlet生成验证码并进行账号密码和验证码的验证登陆!

    前言: 人不是生来就懂事的,在编程的世界也是一样,想想在大一的时候我还是那个连输出Hello World!都不会的小孩子是,现在我已经可以编出属于我自己的小程序了.编程其实并不可怕,可怕的是你不去编. ...

  5. SonarQube系列三、Jenkins集成SonarQube(dotnetcore篇)

    [前言] 本系列主要讲述sonarqube的安装部署以及如何集成jenkins自动化分析.netcore项目.目录如下: SonarQube系列一.Linux安装与部署 SonarQube系列二.分析 ...

  6. 第一次亲密接触——二狗子初识 CDN

    二狗子是国内知名XXX大学的在校学生,作为一名编程爱好者,他利用业余时间搭建了一个网站,把平时的学习心得和技术分享全都 PO 在自己的网站上.渐渐地,二狗子的网站因为文章质量高,技术分享全面,受到了很 ...

  7. 100天搞定机器学习|Day17-18 神奇的逻辑回归

    前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...

  8. 前端项目优化 -Web 开发常用优化方案、Vue & React 项目优化

    github github-myBlob 从输入URL到页面加载完成的整个过程 首先做 DNS 查询,如果这一步做了智能 DNS 解析的话,会提供访问速度最快的 IP 地址回来 接下来是 TCP 握手 ...

  9. 本地在不安装Oracle的情况下安装PLSQL客户端

    本文解决问题:   通常在本地安装PLSQL后,如果本地没有安装Oracle数据库的话,PLSQL是不能使用的,输入远程数据库登录信息会提示:"Oracle Client没有正确安装&quo ...

  10. 基于vue手写tree插件那点事

    目录 iview提供的控件 手写控件 手写控件扩展 手写控件总结 # 加入战队 微信公众号 主题 Tree树形控件在前端开发中必不可少,对于数据的展示现在网站大都采取树形展示.因为大数据全部展示出来对 ...