题意:一张网格图,多组数据,输入n,m,sx,sy,tx,ty大小,起终点

接下来共有2n-1行,奇数行有m-1个数,表示横向的边权,偶数行有m个数,表示纵向的边权

样例输入:

4  4  1  1  4  4

10 10 10

9 0 0 10

0 0 0

9 0 0 10

0 9 0 10

0 9 9

2 2 1 1 2 2

0

1 1

0

0 0 0 0 0 0

样例输出:

Case 1:  100

Case 2:  Impossible

我们发现此题的特点在于允许转向,也就是说我们可以将转向的状态利用一维表示出来以进行转移

同时由于起终点也需要*2,我们干脆新开两维,一维表示是否*2,另一维表示当前已经操作后面对的方向

利用spfa进行转移即可

#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std;
const int NN=;
const int NNN=;
const int inf=;
inline int read(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+(ch^);ch=getchar();}
return x*f;} int g[NN][];
int d[NNN];
bool vis[NNN]; int dx[]={,,,-};
int dy[]={,-,,}; int n,m,sx,sy,tx,ty,x,y,t,idx,w;
struct node{int x,y,t;};queue<node> q; inline int calc(int x,int y){return (x-)*m+(y-);}
inline int calc(int x,int y,int t){return calc(x,y)*+t;}
bool check(int x,int y){return <=x&&x<=n&&<=y&&y<=m;} int main(){
while(scanf("%d%d%d%d%d%d",&n,&m,&sx,&sy,&tx,&ty)!=EOF&&n&&m){ rep(i,,*n-)
if(i&) rep(y,,m-){
x=(i+)/,w=read();if(!w) w=inf;
g[calc(x,y)][]=g[calc(x,y+)][]=w;}
else rep(y,,m){
x=i/,w=read();if(!w) w=inf;
g[calc(x,y)][]=g[calc(x+,y)][]=w;}
//t代表的状态是身后已经加的边的状态 memset(d,,sizeof d);
d[calc(sx,sy,)]=;
vis[calc(sx,sy,)]=;
q.push((node){sx,sy,}); while(!q.empty()){
x=q.front().x;
y=q.front().y;
t=q.front().t;q.pop();
vis[calc(x,y,t)]=; // 4 前后都要二倍
if(t<){// i-i
int xx=x+dx[t],yy=y+dy[t];
if(!check(xx,yy)) continue;
int w=g[calc(x,y)][t];
if(d[calc(xx,yy,t)]>d[calc(x,y,t)]+w){
d[calc(xx,yy,t)]=d[calc(x,y,t)]+w;
if(!vis[calc(xx,yy,t)])
vis[calc(xx,yy,t)]=,q.push((node){xx,yy,t});}
w=w*;//i-4
if(d[calc(xx,yy,)]>d[calc(x,y,t)]+w){
d[calc(xx,yy,)]=d[calc(x,y,t)]+w;
if(!vis[calc(xx,yy,)])
vis[calc(xx,yy,)]=,q.push((node){xx,yy,});}
}else{
for(int i=;i<=;i++){
int xx=x+dx[i],yy=y+dy[i];
if(!check(xx,yy)) continue;
int w=g[calc(x,y)][i]*; //4 是转向所以w跟随i变化
// 4-i
if(d[calc(xx,yy,i)]>d[calc(x,y,t)]+w){
d[calc(xx,yy,i)]=d[calc(x,y,t)]+w;
if(!vis[calc(xx,yy,i)])
vis[calc(xx,yy,i)]=,q.push((node){xx,yy,i});}
// 4-4
if(d[calc(xx,yy,)]>d[calc(x,y,t)]+w){
d[calc(xx,yy,)]=d[calc(x,y,t)]+w;
if(!vis[calc(xx,yy,)])
vis[calc(xx,yy,)]=,q.push((node){xx,yy,});
}
}
}/*
i-i 正常直走
i-4 决策 转弯的第一条边
到达终点
4-i 决策 转弯的第二条边
起点结束
4-4 决策 转弯到终点
决策 连续转弯
*/
}// 三维状态 二维权值
int ans=d[calc(tx,ty,)];
if(ans>=inf) printf("Case %d: Impossible\n",++idx);
else printf("Case %d: %d\n",++idx,ans);
}return ;
}

完结撒花

模拟赛20181015 Uva1078 bfs+四维dp的更多相关文章

  1. 6.28 NOI模拟赛 好题 状压dp 随机化

    算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...

  2. 「模拟赛20190327」 第二题 DP+决策单调性优化

    题目描述 小火车虽然很穷,但是他还是得送礼物给妹子,所以他前往了二次元寻找不需要钱的礼物. 小火车准备玩玩二次元的游戏,游戏当然是在一个二维网格中展开的,网格大小是\(n\times m\)的,某些格 ...

  3. 【noip模拟赛7】上网 线性dp

    描述 假设有n个人要上网,却只有1台电脑可以上网.上网的时间是从1 szw 至 T szw ,szw是sxc,zsx,wl自创的时间单位,至于 szw怎么换算成s,min或h,没有人清楚.依次给出每个 ...

  4. 【noip模拟赛5】任务分配 降维dp

    描述 现有n个任务,要交给A和B完成.每个任务给A或给B完成,所需的时间分别为ai和bi.问他们完成所有的任务至少要多少时间. 输入 第一行一个正整数n,表示有n个任务.接下来有n行,每行两个正整数a ...

  5. 2017-5-14 湘潭市赛 Similar Subsequence 分析+四维dp+一些简单优化

    Similar Subsequence Accepted : Submit : Time Limit : MS Memory Limit : KB Similar Subsequence For gi ...

  6. (计数器)NOIP模拟赛(神奇的数位DP题。。)

    没有原题传送门.. 手打原题QAQ [问题描述]     一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0,1,2,…,9.其中—个页码不含多余的0,如N=1234时第5页不是00 ...

  7. codehunter 「Adera 6」杯省选模拟赛 网络升级 【树形dp】

    直接抄ppt好了--来自lyd 注意只用对根判断是否哟留下儿子 #include<iostream> #include<cstdio> using namespace std; ...

  8. 「模拟赛20191019」B 容斥原理+DP计数

    题目描述 将\(n\times n\)的网格黑白染色,使得不存在任意一行.任意一列.任意一条大对角线的所有格子同色,求方案数对\(998244353\)取模的结果. 输入 一行一个整数\(n\). 输 ...

  9. 「模拟赛20191019」A 简单DP

    题目描述 给一个\(n\times m\)的网格,每个格子上有一个小写字母. 对于所有从左上角\((1,1)\)到右下角\((n,m)\)只向下或向右走的路径构成的集合,判断是否存在两条走法不同的路径 ...

随机推荐

  1. Win7环境 搭建IIS环境。发布asp.net MVC项目到IIS(第一期)

    一.右键添加网站,输入网站基本配置信息. 二.成功添加网站后,应用程序池里会多一个应用,版本一定要改成4.0,并且模式是集成模式,否则项目报错(原因可以看配置文件中的版本信息). 三.再启用项目时可能 ...

  2. windows压缩图片

  3. 使用cmd查看电脑连接过的wifi密码并将密码发送至指定邮箱(三)

    之前,我写了使用cmd查看电脑连接过的wifi密码(二)和使用cmd查看电脑连接过的wifi密码(一)但其中的功能不完善,在本次的更新中新增了更多的功能,其实2018/10/24 就更新完成了,一直拖 ...

  4. 测试面试话题8:测试人员如何让开发少写bug?

    在测试过程中和不同开发合作,往往会发现一些bug都是大多数开发人员常出现的错误,为了帮助开发人员,也减少测试的重复工作量,非常有必要将以往出现的bug做整理,分析原因,让开发知道这些bug, 避免再次 ...

  5. 三十九、vue中element最原始的分页(未封装的)

    html<el-table ref="scoreUserTable" :data="scorePageUser.slice((currentPage1-1)*pag ...

  6. RB-Tree插入过程详解

    红黑树具有很优秀的特性,其自平衡性特性,局部调整特性使得红黑树插入,删除,以查找,以及这些过程的内存资源的占用,的综合性能是非常高的(通常我们会拿红黑树和AVL树进行对比). 对于红黑树的这些特性,在 ...

  7. 在C++中定义常量

    在 C++ 中,有两种简单的定义常量的方式: 使用 #define 预处理器. 使用 const 关键字 使用 #define 预处理器: #define identifier value: #inc ...

  8. js面向对象学习

    纯属笔记,加强记忆,不是教程,欢迎纠错,没有逻辑,不太适合学习使用. -------------- 继承多态等太多概念难以理解,还是从实践中慢慢学吧!争取能大致看懂网上的开源的代码. -------- ...

  9. Python基础:搭建开发环境(1)

    1.Python语言简介 2.Python环境 Python环境产品存在多个. 2.1 CPython CPython是Python官方提供的.一般情况下提到的Python就是指CPython,CPy ...

  10. Linux几大服务

    server0操作: 1.创建/devops目录,并修改其SELINUX安全上下文 # mkdir /devops # vim /devops/1.mp3# chcon -R -t samba_sha ...