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到其他点 ...
随机推荐
- Asp.Net MVC SingleServiceResolver类剖析
SingleServiceResolver一般用于类工厂创建和注入点接口留白.类工厂创建比如Controller控制依赖于此类的创建,注入点留白实质上是依赖注入所对外预留的接口. 以第二个特性为例. ...
- 利用模板生成html页面(NVelocity)
公司的网站需要有些新闻,每次的新闻格式都是一样的,而不想每次都查询操作,所以想把这些新闻的页面保存成静态的html,之后搜索了下就找到了这个模板引擎,当然其他的模板引擎可以的,例如:Razor,自己写 ...
- Web前端开发工程师课程大纲
PHP程序员雷雪松整理出来的一套独一无二的Web前端开发课程.本套Web前端开发课程专门为想励志成为优秀web前端工程师的学习者而总结归纳的,本套Web前端课程舍弃了一些不常用的即将废弃的HTML标签 ...
- Excel批量导入(导出同理)
在做JavaWeb中添加数据使我们在所难免会遇到的,在大数据的环境下批量添加和批量删除是必须的,而批量删除只需要获取到我们需要删除的ID就可以了,在批量添加中我们就会遇到问题,问题是得到批量的数据,这 ...
- Docker 前沿概述
目录 Docker 前沿概述 什么是Docker? Docker的基本概念 容器(Container) -- 镜像运行时的实体 镜像(Image) -- 一个特殊的文件系统 仓库(Repository ...
- Java反射Reflect的使用详解
目录 一. 什么是反射 二. 反射的基础Class 2.1 Class类概述 2.2 Class类对象获取的三种方式 三. 反射-构造函数 3.1 getDeclaredConstructor(Cla ...
- linux command line learn - get the absolute path of a file
get the absolute path of a file in linux readlink -f filenme [heshuai@login01 3_Variation_calling]$ ...
- F#周报2019年第33期
新闻 宣告.NET Core 3.0预览版8 新的fable.io站点伴随着更多文档发布 正在努力使你的团队相信F#的益处?Compositional IT能够提供帮助 提名2019年度F#社区英雄 ...
- 关于在taro使用wx.parse那些事
好久不见,好久没更新博客,最近工作也比较忙,今天在使用解决富文本的时候遇到两个bug,由于第一次使用wx.parse经验不足,走了很多弯路,今天特地把自己修复bug的感想分享一下,希望能帮助更多的小伙 ...
- PostgreSQL创建扩展出错
问题: loraserver_as=# create extension pg_trgm; ERROR: could not open extension control file "/us ...