codeforces 821 D. Okabe and City(最短路)
题目链接: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(最短路)的更多相关文章
- CodeForces 821D Okabe and City
Okabe and City 题解: 将行和列也视为一个点. 然后从普通的点走到行/列的点的话,就代表这行/列已经被点亮了. 然后将费用为0的点建上边. 注意讨论(n,m)非亮的情况下. 代码: #i ...
- CF821 D. Okabe and City 图 最短路
Link 题意:给出$n*m$大小的地图,已有$k$盏灯亮,人从左上角出发,右下角结束,期间必须走路灯点亮的地方,他可以在任意时刻消耗一枚硬币点亮一行或一列灯,他最多同时点亮一行或一列灯,要想点亮别的 ...
- CodeForces 173B Chamber of Secrets 二分图+最短路
题目链接: http://codeforces.com/problemset/problem/173/B 题意: 给你一个n*m的地图,现在有一束激光从左上角往左边射出,每遇到‘#’,你可以选择光线往 ...
- Codeforces 787D. Legacy 线段树建模+最短路
D. Legacy time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- ACM学习历程—CodeForces 601A The Two Routes(最短路)
题目链接:http://codeforces.com/problemset/problem/601/A 题目大意是有铁路和陆路两种路,而且两种方式走的交通工具不能在中途相遇. 此外,有铁路的地方肯定没 ...
- HDU-4849 Wow! Such City!,最短路!
Wow! Such City! 题意:题面很难理解,幸亏给出了提示,敲了一发板子过了.给出x数组y数组和z数组的求法,并给出x.y的前几项,然后直接利用所给条件构造出z数组再构造出C数组即可,C ...
- 【codeforces 821E】Okabe and El Psy Kongroo
[题目链接]:http://codeforces.com/problemset/problem/821/E [题意] 一开始位于(0,0)的位置; 然后你每次可以往右上,右,右下3走一步; (x+1, ...
- 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 ...
- Codeforces 954D Fight Against Traffic(BFS 最短路)
题目链接:Fight Against Traffic 题意:有n个点个m条双向边,现在给出两个点S和T并要增加一条边,问增加一条边且S和T之间距离不变短的情况有几种? 题解:首先dfs求一下S到其他点 ...
随机推荐
- soap天气查询
public class MainActivity extends AppCompatActivity { private TextView tvContent; @Override protecte ...
- 使用CefSharp在.NET中嵌入Chromium
使用CefSharp可以在.NET轻松的嵌入Html,不用担心WPF与Winform 控件与它的兼容性问题,CefSharp大部分的代码是C#,它可以在VB或者其他.NET平台语言中来进行使用. 近几 ...
- Netty基础系列(5) --零拷贝彻底分析
前言 上一节(堆外内存与零拷贝)当中我们从jvm堆内存的视角解释了一波零拷贝原理,但是仅仅这样还是不够的. 为了彻底搞懂零拷贝,我们趁热打铁,接着上一节来继续讲解零拷贝的底层原理. 感受一下NIO的速 ...
- 在linux中部署项目并创建shell脚本
1.首先要在idea中父工程maven包下执行clean生成的target包 2.执行package打包,打包时候讲test勾去掉 3.将target包中生成的jar包cp出来 此处注意打包时必须要保 ...
- Kali Linux无法访问网络的问题
首先 ping www.baidu.com ping: unkown host www.baidu.com 然后 ping 8.8.8.8 connect:network is unreachable ...
- 自然语言处理(NLP)的一般处理流程!
1. 什么是NLP 自然语言处理 (Natural Language Processing) 是人工智能(AI)的一个子领域.自然语言处理是研究在人与人交互中以及在人与计算机交互中的语言问题的一门学科 ...
- 小白学Python(6)——python-pptx 添加图表
添加图表 以下代码在新演示文稿中添加单系列柱形图 from pptx import Presentation from pptx.chart.data import CategoryChartData ...
- 渗透之路基础 -- 跨站脚本攻击XSS
目录 漏洞原理及防御 XSS 原理分析:输出问题导致js代码被识别执行 XSS 技术分类 Cookie盗取 基于Xss的WebShell箱子的攻击 XSS相关防护过滤及绕过分析(参考链接) 防护: 绕 ...
- Vim高手,从来不用鼠标
Vim脱离鼠标第一步 平时不可缺少的会用到vim,但是避免不了鼠标,事实上,省略鼠标是完全可以的,没有想像中那么难,看我短短几行带大家一起省略鼠标. 对了,vim有三种模式,基本模式就是用来输入命令的 ...
- oauth2.0授权详解
学习oauth认证之前先回顾一下通过sessionid的会话过程 关于session与cookie的请戳:https://www.cnblogs.com/moran1992/p/10793748.ht ...