欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ4992


题意概括

  在一幅n*n的地图上,Amber从左上角走到右下角,每走一步需要花费时间t,每走完3步时,还要加上到达的那个格子的值。这里的3步不包括起动的那个格子。如果刚好3步到达右下角,则右下角格子的值也要算进花费中,否则不用计算进去。求最小花费。n<=100


题解

  最短路写一写就可以了,居然不卡spfa!

  有一个点要注意:每一个点要建16条边,我就是因为少建了4条边,少了100分……

  是这样的:每走3步建一条边,与该点距离为3的点,每个一条边,共12条;与该点距离为1的点,也要建边,这个就是我万万没想到的WA掉了。这四条边的结果,还不如打暴力!当然别忘了建连向终点的5条特殊的边。


代码

#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
const int N=100+5,M=N*N*16;
const int dx[16]={-3, 0, 3, 0,-2,-2, 2, 2,-1,-1, 1, 1, 1,-1, 0, 0};
const int dy[16]={ 0,-3, 0, 3, 1,-1, 1,-1, 2,-2, 2,-2, 0, 0, 1,-1};
int n;
LL a[N][N],t;
struct Edge{
int cnt,y[M],nxt[M],fst[N*N];
LL z[M];
void set(){
cnt=0;
memset(y,0,sizeof y);
memset(z,0,sizeof z);
memset(nxt,0,sizeof nxt);
memset(fst,0,sizeof fst);
}
void add(int a,int b,LL c){
cnt++;
y[cnt]=b,z[cnt]=c;
nxt[cnt]=fst[a],fst[a]=cnt;
}
}e;
bool check(int x,int y){
return 1<=x&&x<=n&&1<=y&&y<=n;
}
int hash(int x,int y){
return (x-1)*n+y-1;
}
void adden(int x,int y){
if (!check(x,y))
return;
e.add(hash(x,y),hash(n,n),t*(abs(n-x)+abs(n-y)));
}
LL dis[N*N];
bool f[N*N];
int q[N*N],qmod,head,tail;
void spfa(){
for (int i=0;i<n*n;i++)
dis[i]=1LL<<55;
memset(f,0,sizeof f);
qmod=n*n+1;
head=0,tail=0;
q[tail=(tail+1)%qmod]=0;
dis[0]=0;
f[0]=1;
while (head!=tail){
int x=q[head=(head+1)%qmod];
f[x]=0;
for (int i=e.fst[x];i;i=e.nxt[i]){
int y=e.y[i];
LL z=e.z[i];
if (dis[y]>dis[x]+z){
dis[y]=dis[x]+z;
if (!f[y]){
f[y]=1;
q[tail=(tail+1)%qmod]=y;
}
}
}
}
}
int main(){
scanf("%d%lld",&n,&t);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
scanf("%lld",&a[i][j]);
e.set();
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++){
int x=hash(i,j);
for (int k=0;k<16;k++){
int i_=i+dx[k],j_=j+dy[k];
if (check(i_,j_))
e.add(x,hash(i_,j_),t*3LL+a[i_][j_]);
}
}
adden(n-2,n),adden(n-1,n-1),adden(n,n-2),adden(n-1,n),adden(n,n-1);
spfa();
printf("%lld",dis[hash(n,n)]);
return 0;
}

  

BZOJ4992 [Usaco2017 Feb]Why Did the Cow Cross the Road 最短路 SPFA的更多相关文章

  1. [BZOJ4992] [Usaco2017 Feb]Why Did the Cow Cross the Road(spfa)

    传送门 把每个点和曼哈顿距离距离它3步或1步的点连一条边,边权为3 * t + a[x][y] 因为,走3步,有可能是3步,也有可能是1步(其中一步拐了回来) 最后,把终点和曼哈顿距离距离它1步和2布 ...

  2. 4990: [Usaco2017 Feb]Why Did the Cow Cross the Road II 线段树维护dp

    题目 4990: [Usaco2017 Feb]Why Did the Cow Cross the Road II 链接 http://www.lydsy.com/JudgeOnline/proble ...

  3. 4989: [Usaco2017 Feb]Why Did the Cow Cross the Road

    题面:4989: [Usaco2017 Feb]Why Did the Cow Cross the Road 连接 http://www.lydsy.com/JudgeOnline/problem.p ...

  4. [BZOJ4990][Usaco2017 Feb]Why Did the Cow Cross the Road II dp

    4990: [Usaco2017 Feb]Why Did the Cow Cross the Road II Time Limit: 10 Sec  Memory Limit: 128 MBSubmi ...

  5. [BZOJ4989][Usaco2017 Feb]Why Did the Cow Cross the Road 树状数组维护逆序对

    4989: [Usaco2017 Feb]Why Did the Cow Cross the Road Time Limit: 10 Sec  Memory Limit: 256 MBSubmit:  ...

  6. [bzoj4994][Usaco2017 Feb]Why Did the Cow Cross the Road III_树状数组

    Why Did the Cow Cross the Road III bzoj-4994 Usaco-2017 Feb 题目大意:给定一个长度为$2n$的序列,$1$~$n$个出现过两次,$i$第一次 ...

  7. BZOJ4997 [Usaco2017 Feb]Why Did the Cow Cross the Road III

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4997 题意概括 在n*n的区域里,每一个1*1的块都是一个格子. 有k头牛在里面. 有r个篱笆把格 ...

  8. BZOJ4994 [Usaco2017 Feb]Why Did the Cow Cross the Road III 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4994 题意概括 给定长度为2N的序列,1~N各处现过2次,i第一次出现位置记为ai,第二次记为bi ...

  9. BZOJ4989 [Usaco2017 Feb]Why Did the Cow Cross the Road 树状数组 逆序对

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4989 题意概括 一条马路的两边分别对应的序列A.B,长度为n,两序列为1到n的全排列.当Ai=Bj ...

随机推荐

  1. IDEA不生成WAR包,报错

    com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.ExecutionExceptionProjec ...

  2. linux系统--磁盘管理命令(一)

    一.基本命令 1.1 查看磁盘分区使用状况:df 参数: l:仅显示本地磁盘(默认) a:显示所有文件系统的磁盘使用情况,包括比如 /proc/ h:以1024进制计算最合适的单位显示磁盘容量 H:以 ...

  3. 啊金学习javascript系列一之javascript整体印象

    javascript是一门编程语言,这个是第一个观点.是编程语言,那就拥有编程语言的功能.在我理解之中,编程语言是和计算机打交道的语言,就是我们跟计算机说话用的语言,是用来指挥计算机的.人类能够理解语 ...

  4. pygame中多个class类之间的关系

    用一个实例介绍一下有关pygame中不同类之间的通信,详细介绍在代码段有标注,感兴趣的可以复制代码试试: import pygame import sys # -------------------- ...

  5. 关于cc -o命令

    这个命令很灵活,格式是: cc -o 目标二进制可执行文件 文件1 文件2 文件3 ..... 其中目标文件后面的文件,可为源代码,也可为二进制文件,也可为库文件 比如: //a.c #include ...

  6. More Effective C++ 条款0,1

    More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类 ...

  7. CSS :invalid 选择器

    如果 input 元素中的值是非法的,实时提醒 <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...

  8. session和cookies

    Cookie 与session的产生过程                                 我们都知道HTTP协议本身是无状态的,客户只需要简单的向服务器来发送请求下载某些文件,客户端向 ...

  9. 【转载】apache log配置 按日期写日志

    指定apache日志每天生成一个文件 Linux系统配置方法 在apache的配置文件httpd.conf中找到 代码如下1 ErrorLog logs/error_log CustomLog log ...

  10. 用rand()和srand()产生伪随机数的方法总结 【转】

    转自:http://blog.chinaunix.net/uid-26722078-id-3754502.html 标准库(被包含于中)提供两个帮助生成伪随机数的函数: 函数一:int rand(vo ...