Link

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

思路:看似很繁琐的题目,其实重点在于每次只能进行一次操作,那么只需要边走边考虑下一步到达的点即可。由于可任选行列,那么意味着下一个点只要和当前位置x和y坐标之差都不超过2,那么都能到达,在此情况上,坐标差之和为1说明相邻不需要消耗硬币,其余情况均消耗一枚硬币。跑个最短路就行了,数据小,BFS都行。

/** @Date    : 2017-07-04 20:40:33
* @FileName: 821D 图 最短路.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL long long
#define PII pair
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 3e5+20;
const double eps = 1e-8; LL dis[N];
LL vis[N];
int n, m, k;
struct yuu
{
int x, y;
}a[N]; void spfa(int s)
{
MMI(dis);
MMF(vis);
queueq;
q.push(s);
dis[s] = 0;
vis[s] = 1;
while(!q.empty())
{
int nw = q.front();
q.pop();
vis[nw] = 0;
for(int i = 1; i <= k; i++)
{
LL tmp;
int dx = abs(a[i].x - a[nw].x);
int dy = abs(a[i].y - a[nw].y);
if(dx + dy == 1)//相邻
tmp = 0;
else if(dx <= 2 || dy <= 2)//距离等于2的中间亮一行连接
tmp = 1;
else
tmp = INF; if(dis[i] > dis[nw] + tmp)
{
dis[i] = dis[nw] + tmp;
if(!vis[i])
vis[i] = 1, q.push(i);
}
}
}
} int main()
{
while(cin >> n >> m >> k)
{
for(int i = 1; i <= k; i++) scanf("%d%d", &a[i].x, &a[i].y); int flag = 0;
for(int i = 1; i <= k && !flag; i++)
if(a[i].x == n && a[i].y == m)
flag = 1; if(!flag)//如果终点是不亮的增加一个点,相当于权值+1
{
k++;
a[k].x = n + 1, a[k].y = m + 1;
}
spfa(1);
LL ans = dis[k];
if(ans >= INF)
ans = -1;
printf("%lld\n", ans);
}
return 0;
}

CF821 D. Okabe and City 图 最短路的更多相关文章

  1. codeforces 821 D. Okabe and City(最短路)

    题目链接:http://codeforces.com/contest/821/problem/D 题意:n*m地图,有k个位置是点亮的,有4个移动方向,每次可以移动到相邻的点亮位置,每次站在初始被点亮 ...

  2. poj3635Full Tank?[分层图最短路]

    Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7248   Accepted: 2338 Descri ...

  3. HDU 5669 线段树优化建图+分层图最短路

    用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...

  4. BZOJ 2763 分层图最短路

    突然发现我不会分层图最短路,写一发. 就是同层中用双向边相连,用单向边连下一层 #include <cstdio> #include <algorithm> #include ...

  5. 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)

    [题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...

  6. 【网络流24题】 No.14 孤岛营救问题 (分层图最短路)

    [题意] 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被敌军俘虏的大兵瑞恩. 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的地形图. 迷宫的外形是 ...

  7. BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路

    BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路 Description “我要成为魔法少女!”     “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切, ...

  8. BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路

    BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M ...

  9. codeforces 787D - Legacy 线段树优化建图,最短路

    题意: 有n个点,q个询问, 每次询问有一种操作. 操作1:u→[l,r](即u到l,l+1,l+2,...,r距离均为w)的距离为w: 操作2:[l,r]→u的距离为w 操作3:u到v的距离为w 最 ...

随机推荐

  1. 【dp】New Keyboard

    http://codeforces.com/gym/101397 B dp[i][j][k]: i为前一个行动的状态,0-switch.1-type,j为当前状态layout的编号,k 是已键入的字符 ...

  2. LAMP 系统服务搭建过程详解

    LAMP 架构在企业里用得非常广泛,目前很多电商公司.游戏公司.移动互联网公司大多都采用这种架构.LAMP指的是Linux.Apache.MySQL.PHP.下面记录了 LAMP 架构系统服务的搭建过 ...

  3. apache反向代理服务器

    1 正向代理: 客户端无法直接访问外部的web,需要在客户端所在的网络内架设一台代理服务器,客户端通过代理服务器访问外部的web(需要在客户端的浏览器中设置代理服务器) 适用于: ①局域网的代理服务器 ...

  4. 【转】Linux C 网络编程——TCP套接口编程

    地址:http://blog.csdn.net/matrix_laboratory/article/details/13669211 2. socket() <span style=" ...

  5. VisualStudio2013 代码查看优化 对齐线

    http://jingyan.baidu.com/article/363872eccef5276e4ba16f91.html

  6. shell脚本学习—正则表达式

    正则表达式概念.特点 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”, 这个“规则字符串”用来表达对字符串的一种过滤辑. 给定一个 ...

  7. Jstack、Jmap命令简单使用

    TOMCAT_ID为tomcat的进程号. 1.使用jstack查看jvm堆栈信息. /bin/ TOMCAT_ID:无法输出到单独的文件中,只能在tomcat的启动文件中打印相关的堆栈信息. jst ...

  8. 计算机网络:A、B、C、D和E类IP地址

    IP地址分为A,B,C,D,E五类. 网络号:用于识别主机所在的网络:主机号:用于识别该网络中的主机. 其中A类分配给政府机关使用,B类地址给大中型企业使用,C类地址给个人使用.这三种是主要的. IP ...

  9. 【纪念】NOIP2018后记——也许是一个新的起点

    如果你为了失去太阳而哭泣,那么你也将失去星星和月亮. —— 泰戈尔<飞鸟集> NOIP结束了,我挂了一道题……曾经在心中觉得怎么都不会考到的分数,就这么冷冷的出现在了我的成绩单上.的确是比 ...

  10. 【ZOJ3316】Game(带花树)

    [ZOJ3316]Game(带花树) 题面 Vjudge 翻译: 给定棋盘上\(n\)个旗子 一开始先手可以随便拿, 然后每次都不能取离上次的曼哈顿距离超过\(L\)的旗子 谁不能动谁输. 问后手能否 ...