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到其他点 ...
随机推荐
- 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 ...
- RabbitMQ(四):使用Docker构建RabbitMQ高可用负载均衡集群
本文使用Docker搭建RabbitMQ集群,然后使用HAProxy做负载均衡,最后使用KeepAlived实现集群高可用,从而搭建起来一个完成了RabbitMQ高可用负载均衡集群.受限于自身条件,本 ...
- ansible批量管理服务 上
1 ansible简介 1.1 ansible批量管理服务概述 (1)是基于python语言开发的自动化软件工具(2)是基于SSH远程管理服务实现远程主机批量管理(3)并行管理,部署简单,应用也简单方 ...
- luogu1330_封锁阳光大学 图的遍历
传送门 解释:(转自洛谷题解) 首先,肯定要明确一点,那就是这个图是不一定联通的.于是,我们就可以将整张图切分成许多分开的连同子图来处理.然而最重要的事情是:如何处理一个连通图? 乍看下去,似乎无从下 ...
- codeforces1088D_Ehab and another another xor problem交互题
传送门 一道考验思维的交互题 大致思路就是从最高的二进制位向下询问 代入例子比如: 5 6 6 5 7 4 6 4 讨论一下 交互题的重点学会推理和归纳 #include <bits/stdc+ ...
- Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)
简介 在网页中我们经常使用缩放操作来便利的查看具体的信息,在appium中使用MultiAction多点触控的类来实现.MultiAction是多点触控的类,可以模拟用户多点操作.主要包含加载add( ...
- Java中...的作用
Java中...的作用,代表接收若干个相同类型的参数 public void testFunction(int...arr){ //接收若干个int类型的参数 for (int i:ar ...
- Vue系列:Websocket 使用配置
WebSocket 是什么? WebSocket 是一种网络通信协议.而且是在 HTML5 才开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. 为什么需要 WebSocket ? 了解计算 ...
- 洛谷 P3413 SAC#1 - 萌数
题意简述 求l~r之间存在长度至少为2的回文子串的正整数的个数 题解思路 数位DP 注意到有偶数长度的回文串必有长度为2的回文串,有奇数长度的回文串必有长度为3的回文串 所以只需判断与前一位,前两位是 ...
- EMCAscript6随心所记
es6的支持情况http://kangax.github.io/compat-table/es6/ 1.let命令 基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变 ...