BZOJ4992 [Usaco2017 Feb]Why Did the Cow Cross the Road 最短路 SPFA
欢迎访问~原文出处——博客园-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的更多相关文章
- [BZOJ4992] [Usaco2017 Feb]Why Did the Cow Cross the Road(spfa)
传送门 把每个点和曼哈顿距离距离它3步或1步的点连一条边,边权为3 * t + a[x][y] 因为,走3步,有可能是3步,也有可能是1步(其中一步拐了回来) 最后,把终点和曼哈顿距离距离它1步和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 ...
- 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 ...
- [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 ...
- [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: ...
- [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$第一次 ...
- BZOJ4997 [Usaco2017 Feb]Why Did the Cow Cross the Road III
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4997 题意概括 在n*n的区域里,每一个1*1的块都是一个格子. 有k头牛在里面. 有r个篱笆把格 ...
- BZOJ4994 [Usaco2017 Feb]Why Did the Cow Cross the Road III 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4994 题意概括 给定长度为2N的序列,1~N各处现过2次,i第一次出现位置记为ai,第二次记为bi ...
- BZOJ4989 [Usaco2017 Feb]Why Did the Cow Cross the Road 树状数组 逆序对
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4989 题意概括 一条马路的两边分别对应的序列A.B,长度为n,两序列为1到n的全排列.当Ai=Bj ...
随机推荐
- 解决IntelliJ IDEA无法读取配置*.properties文件的问题
idea对这些配置的文件方式很明显和eclipse是不同的.在idea中有一个 Content Roots的概念.需要为每一个folder配置相应的Content Roots.Content Root ...
- OpenCV入门(2)- Java第一个程序
1.下载和安装OpenVC环境 从官方连接 https://opencv.org/releases.html 下载Windows的安装包 下载下来的就是一个压缩包,安装解压后,对Java开发有效的目录 ...
- luogu P4082 [USACO17DEC]Push a Box
传送门 一个人推箱子,和之前的华容道中的棋子移动有异曲同工之妙,因为每次可以让人走到箱子的其他方向上,或者推一下箱子 所以状态可以设成\(f_{i,j,k}\),即箱子在\((i,j)\),人在\(k ...
- luogu P2779 [AHOI2016初中组]黑白序列
传送门 注:本题解中下标从1开始 这题可以想出一个\(O(n^2)\)的dp,只要考虑每个偶数位置可以从前面的哪个位置加上一个"B...W..."转移过来 然而数据范围有5e5,, ...
- Mac下压力测试工具siege
安装: brew install siege 用法: siege -c 并发数 -t 运行测试时间 URL 如: siege -c 1000 -t 5S URL 这里要注意的是-t后面的时间要带单位, ...
- C++ vector 使用笔记
map 插入 vector #include <string> #include <iostream> #include <algorithm> #include ...
- mysql 案例 ~ pt修复工具的使用
简介:今天咱们来聊聊PT修复工具pt-table-sync 注意事项: 1 表要有主键或者唯一键 2 针对每一个chunk加的是for update锁 3 修复过程中不能容忍从库延迟 如果 ...
- ARMV8 datasheet学习笔记3:AArch64应用级体系结构之Memory order
1.前言 2.基本概念 Observer 可以发起对memory read/write访问的都是observer; Observability 是一种观察能力,通过read可以感知到别的observe ...
- 升级tomcat需要更改哪些配置?
1.上传Tomcatapache-tomcat-7.0.84.zip将38服务器上的Tomcat传到107服务器指定目录:scp /data/apache-tomcat-7.0.84.zip jsdx ...
- mysql数据库查询库中所有表所占空间大小
SELECT CONCAT(table_schema,'.',table_name) AS 'TABLE_NAME', CONCAT(, ),'M') AS 'ROW_SIZE', CONCAT( ) ...