模拟赛20181015 Uva1078 bfs+四维dp
题意:一张网格图,多组数据,输入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的更多相关文章
- 6.28 NOI模拟赛 好题 状压dp 随机化
算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...
- 「模拟赛20190327」 第二题 DP+决策单调性优化
题目描述 小火车虽然很穷,但是他还是得送礼物给妹子,所以他前往了二次元寻找不需要钱的礼物. 小火车准备玩玩二次元的游戏,游戏当然是在一个二维网格中展开的,网格大小是\(n\times m\)的,某些格 ...
- 【noip模拟赛7】上网 线性dp
描述 假设有n个人要上网,却只有1台电脑可以上网.上网的时间是从1 szw 至 T szw ,szw是sxc,zsx,wl自创的时间单位,至于 szw怎么换算成s,min或h,没有人清楚.依次给出每个 ...
- 【noip模拟赛5】任务分配 降维dp
描述 现有n个任务,要交给A和B完成.每个任务给A或给B完成,所需的时间分别为ai和bi.问他们完成所有的任务至少要多少时间. 输入 第一行一个正整数n,表示有n个任务.接下来有n行,每行两个正整数a ...
- 2017-5-14 湘潭市赛 Similar Subsequence 分析+四维dp+一些简单优化
Similar Subsequence Accepted : Submit : Time Limit : MS Memory Limit : KB Similar Subsequence For gi ...
- (计数器)NOIP模拟赛(神奇的数位DP题。。)
没有原题传送门.. 手打原题QAQ [问题描述] 一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0,1,2,…,9.其中—个页码不含多余的0,如N=1234时第5页不是00 ...
- codehunter 「Adera 6」杯省选模拟赛 网络升级 【树形dp】
直接抄ppt好了--来自lyd 注意只用对根判断是否哟留下儿子 #include<iostream> #include<cstdio> using namespace std; ...
- 「模拟赛20191019」B 容斥原理+DP计数
题目描述 将\(n\times n\)的网格黑白染色,使得不存在任意一行.任意一列.任意一条大对角线的所有格子同色,求方案数对\(998244353\)取模的结果. 输入 一行一个整数\(n\). 输 ...
- 「模拟赛20191019」A 简单DP
题目描述 给一个\(n\times m\)的网格,每个格子上有一个小写字母. 对于所有从左上角\((1,1)\)到右下角\((n,m)\)只向下或向右走的路径构成的集合,判断是否存在两条走法不同的路径 ...
随机推荐
- js坚持不懈之12:var b = {a:1};
今天看到一篇博客,在声明一个变量的时候用了如下格式的语法: var b = {a:1}; 不明白,百度一下.作如下解释: var: 声明一个变量 b: 表示变量的名称 =: 赋值符号 {}: 表示一个 ...
- Centos7 安装mysql-8.0.13(rpm)
yum or rpm? yum安装方式很方便,但是下载mysql的时候从官网下载,速度较慢. rpm安装方式可以从国内镜像下载mysql的rpm包,比较快.rpm也适合离线安装. 环境说明 操作系统: ...
- 这可能是最简单的Page Object库
做过web自动化测试的同学,对Page object设计模式应该不陌生. Page object库应该根据以下目标开发: Page object应该易于使用 清晰的结构 PageObjects 对于页 ...
- QPalette
Help on class QPalette in module PyQt5.QtGui: class QPalette(sip.simplewrapper) | QPalette() | QPa ...
- properJavaRDP 跑通本地远程桌面
参考:https://www.cnblogs.com/jfqiu/p/3192364.html 包下载:https://mega.nz/#!HnIX0ajA!lcovIdmYWWJJVRngMsQFK ...
- 【网站公告】请大家不要发表任何涉及“得到App”的内容
大家好,今天我们收到来自杭州某某网络科技有限公司的维权骑士团队的邮件,说他们受某某(天津)文化传播有限公司委托,展开维权.园子里有些博主因为学习“得到App”的课程在博客中记了一些笔记,也被维权. 为 ...
- 项目总结-timerTask的使用
关于使用timerTask来进行定时任务的研究 业务说明:每天的0点执行一次 调用说明:com.hzmd.itest.db.ItestDbUtil中的startPermitTimer()方法进行最终的 ...
- 用WPS查看两篇word文档异同之处
写的合同,后期又有修改,电脑里同样名字的合同有好几个版本,不知道有什么不同,怎么办? 打开wps-->[审阅]-->[比较],剩下的按照提示很容易,略...
- .net string类型集合转int集合
1.string集合转int集合 //string类型的集合 List<string> tempStr = new List<string>() { "21" ...
- html实体命名
本文转自:http://www.cnblogs.com/kiter/archive/2011/08/05/2128309.html (转发备用) 1.特色的 © © © 版权标志 | | 竖线,常 ...