其实,这道题不用long long也能AC。


题意是给你一个矩阵,有一些格子被点亮有一些没有,每一次只能在被点亮的格子上面走。

然后你每一次都可以选择点亮一行或一排(非永久),现在问你最少点多少次可以走到终点?


思路十分好想。

我们把相邻的格子边权设为0,把不相邻但只差一行的格子之间边权设为1。(其他情况都不能直接到达)

然后跑一下SPFA就可以了。

但是需要考虑一个特例:终点有没有被点亮。

如果点了的话那没关系,没点的话得把(n+1,m+1)设为点亮的点。(要不然我们走不到终点不是吗)


AC代码如下:

11149ms/192kb

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
namespace StandardIO{
template<typename T>inline void read(T &x){
x=0;T f=1;char c=getchar();
for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';
x*=f;
}
template<typename T>inline void write(T x){
if(x<0)putchar('-'),x*=-1;
if(x>=10)write(x/10);
putchar(x%10+'0');
}
}
using namespace StandardIO;
namespace Solve{
const int N=10100;
const int INF=0x3f3f3f3f;
int n,m,k;
struct node{
int from,to;
}edge[N];
int dis[N],vis[N];
inline int spfa(){
for(register int i=1;i<=k;++i)dis[i]=INF;
queue<int>q;q.push(1);
vis[1]=1,dis[1]=0;
while(!q.empty()){
int to=q.front();q.pop();
vis[to]=0;
for(register int i=1;i<=k;++i){
if(to==i)continue;
int val=INF;
int dx=abs(edge[to].from-edge[i].from),dy=abs(edge[to].to-edge[i].to);
if(dx+dy==1)val=0;
else if(dx<=2||dy<=2)val=1;
if(dis[i]>dis[to]+val){
dis[i]=dis[to]+val;
if(!vis[i]){
q.push(i),vis[i]=1;
}
}
}
}
if(dis[k]!=INF)return dis[k];
return -1;
}
inline void solve(){
read(n),read(m),read(k);
int flag=0;
for(register int i=1;i<=k;++i){
read(edge[i].from),read(edge[i].to);
if(edge[i].from==n&&edge[i].to==m)flag=1;
}
if(!flag)edge[++k].from=n+1,edge[k].to=m+1;
write(spfa());
}
}
using namespace Solve;
int main(){
solve();
}

题解 CF821D 【Okabe and City】的更多相关文章

  1. CodeForces 821D Okabe and City

    Okabe and City 题解: 将行和列也视为一个点. 然后从普通的点走到行/列的点的话,就代表这行/列已经被点亮了. 然后将费用为0的点建上边. 注意讨论(n,m)非亮的情况下. 代码: #i ...

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

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

  3. CF821 D. Okabe and City 图 最短路

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

  4. Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo DP+矩阵快速幂加速

    E. Okabe and El Psy Kongroo     Okabe likes to take walks but knows that spies from the Organization ...

  5. Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo 矩阵快速幂优化dp

    E. Okabe and El Psy Kongroo time limit per test 2 seconds memory limit per test 256 megabytes input ...

  6. Codeforces 821E Okabe and El Psy Kongroo(矩阵快速幂)

    E. Okabe and El Psy Kongroo time limit per test 2 seconds memory limit per test 256 megabytes input ...

  7. Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo dp+矩阵快速幂

    E. Okabe and El Psy Kongroo   Okabe likes to take walks but knows that spies from the Organization c ...

  8. Codeforces Round #420 (Div. 2)

    /*************************************************************************************************** ...

  9. Codeforces Round #420 (Div. 2) A-E

    本来打算划划水洗洗睡了,突然听到这次的主人公是冈部伦太郎 石头门(<steins;gate>)主题的比赛,岂有不打之理! 石头门真的很棒啊!人设也好剧情也赞曲子也特别好听. 推荐http: ...

随机推荐

  1. 【Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A】 Doggo Recoloring

    [链接] 我是链接,点我呀:) [题意] 你可以把出现次数大于1的颜色换成其他颜色. 问你最后能不能全都变成同一种颜色 [题解] 判断一下有没有出现次数大于1的就好. 有的话.显然可以一直用它变颜色. ...

  2. 【转】C# ArcgisEngine开发中,对一个图层进行过滤,只显示符合条件的要素

    有时候,我们要对图层上的地物进行有选择性的显示,以此来满足实际的功能要求. 按下面介绍的方法可轻松实现图层属性过滤显示: 1.当图层已经加载时 private void ShowByFilter(Ax ...

  3. rails new app的时候设置skip-bundle

    rails new app的时候设置skip-bundle rails new app --skip-bundle 这样可以越过bundle install阶段:

  4. hdu 4717 The Moving Points(三分)

    http://acm.hdu.edu.cn/showproblem.php?pid=4717 大致题意:给出每一个点的坐标以及每一个点移动的速度和方向. 问在那一时刻点集中最远的距离在全部时刻的最远距 ...

  5. sedna载入xml文件

    如果有一个xml文件a.xml.须要把它载入到sedna数据库xml_db里. sedna是通过se_term把xml载入到数据库的.有两种方法: 1.通过se_term的-query參数. se_t ...

  6. eclipse转Android studio遇到的那些坑

           公司项目有导入10多个libray,还有涉及ndk,转Android studio时碰到不少问题.前后大概花费5个工作日,中间各种奇葩bug,各种编译出错,非常多还有没错误提示.一度想过 ...

  7. 2015.04.21,外语,读书笔记-《Word Power Made Easy》 12 “如何奉承朋友” SESSION 32

    TEASER PREVIEW 如何描述这些人: 很友好.容易相处的人: 不知疲倦的人: 简单.直率..aboveboard([ə'bʌv'bɔ:d] adv. 光明正大地, 率直地 adj. 光明正大 ...

  8. ubuntu 绘制lenet网络结构图遇到的问题汇总

    Couldn't import dot_parser, loading of dot files will not be possible的问题 1 .sudo pip uninstall pypar ...

  9. 【转】解析<button>和<input type="button"> 的区别

    一.定义和用法 <button> 标签定义的是一个按钮. 在 button 元素内部,可以放置文本或图像.这是<button>与使用 input 元素创建的按钮的不同之处. 二 ...

  10. Team Services 自动化部署项目

    一.创建Team Services账号 直接使用vs的账号即可,TS上集成了Git.把项目导入到Git中. 使用前提:有自己的服务器,把项目自动化部署到服务器上. 二.创建一个新的定义 三.选择种类( ...