【Uva 10269 马里奥与公主的归途】
·马里奥n次解救了公主,现在需要从魔王的宫殿返回。
·英文题,述大意:
给定一个点数不超过100的无向图,其中的点分为两类:乡村和城堡。
输入A个乡村,B个城堡(乡村编号1~A,城堡编号A+1~B),并给出m条无向路径及其需要花费的时间。不过还输入了K,L,表示马里奥有一双可以使用K次的高级鞋子,使用一次可前往原本L时间内的所有地方(一瞬间)。不过有一个限制条件是若使用鞋子加速,不能够穿过城堡(注意,是穿过,到达城堡是可以的)。询问从城堡A+B回到乡村1的最短时间。
·分析:
高级鞋子是一个很高级的东西。首先发现如果写最短路算法,那么需要两种路径更新:①正常行走②瞬间移动。但一般的最短路算法都是相邻点之间走来走去,这为瞬间移动的状态更新带来了极大的不便。所以将两种状态更新不加处理地写入同一个最短路算法是不明智之举。
·先预处理一种情况得的最短路。另一种情况在前一情况的辅助下进行更新。如果我们能够预先知道不穿过城堡的情况下每条路径的正常行走需要花费的时间,在来抉择这一段路需不需要用鞋子瞬移代替(当然,必须提醒的是,城堡之间也是可以用鞋子的,不要读错题啦)。任意两点之间的最短路径,让我们想到使用Floyd,要让不穿过城堡,即使得更新中继点不能为城堡就可以了。
·接下来的处理就很常规了。我们需要定义新状态来组成点,以表示当前还有t次使用鞋子的机会,已经走到了u点,即f[t][u]。状态更新就两种方式:
①f[t][u]+(路径时间)----->f[t][v]:表示正常行走
②f[t][u]+0------>f[t-1][v]:使用魔法鞋子
·大米饼使用的是SPFA,卡到了Vjudge这道题的第一名(now)。
#include<queue>
#include<stdio.h>
#include<algorithm>
#define inf 1000000000
#define go(i,a,b) for(int i=a;i<=b;i++)
using namespace std;const int N=;
struct State{int u,t;}U;queue<State>q;
int T,A,B,m,L,K,n,u,v,w,g[N][N],f[][N],*F;bool inq[N][];
int main(){scanf("%d",&T);while(scanf("%d%d%d%d%d",&A,&B,&m,&L,&K),n=A+B,T--)
{
go(i,,n){go(j,,n)g[i][j]=inf;
go(j,,K)f[j][i]=inf,inq[i][j]=;}
go(i,,m)scanf("%d%d%d",&u,&v,&w),g[v][u]=g[u][v]=w;
go(k,,A)go(i,,n)go(j,,n)g[i][j]=min(g[i][j],g[i][k]+g[k][j]); inq[n][K]=;f[K][n]=;q.push((State){n,K});while(!q.empty())
{
U=q.front();q.pop();inq[U.u][U.t]=;F=f[U.t];
go(i,,n)
{
if(F[i]>F[U.u]+g[U.u][i])F[i]=F[U.u]+g[U.u][i],
!inq[i][U.t]?q.push((State){i,U.t}),inq[i][U.t]=:;
if(U.t&&g[U.u][i]<=L&&f[U.t-][i]>F[U.u])f[U.t-][i]=F[U.u],
!inq[i][U.t-]?q.push((State){i,U.t-}),inq[i][U.t-]=:;
}
}
int ans=inf;go(i,,K)ans=min(ans,f[i][]);printf("%d\n",ans);
}return ;}//Paul_Guderian
·事后发现,这道题的点数较少,K无比地小。我们可以对程序稍做改进,可以达到更快的速度。我们的新方式是,queue只需要存储节点,无需记录时间。对于每个出队节点,枚举它的所有可能时间进行状态更新,这样减少了搜索的层数。
#include<queue>
#include<stdio.h>
#include<algorithm>
#define go(i,a,b) for(int i=a;i<=b;i++)
#define inf 100000000
using namespace std;const int N=;queue<int>q;
int T,A,B,m,L,K,n,u,v,w,g[N][N],f[][N],*F;bool inq[N];
int main(){scanf("%d",&T);while(scanf("%d%d%d%d%d",&A,&B,&m,&L,&K),n=A+B,T--)
{
go(i,,n){go(j,,n)g[i][j]=inf;
go(j,,K)f[j][i]=inf;inq[i]=;}
go(i,,m)scanf("%d%d%d",&u,&v,&w),g[v][u]=g[u][v]=w;
go(k,,A)go(i,,n)go(j,,n)g[i][j]=min(g[i][j],g[i][k]+g[k][j]); f[K][n]=;q.push(n);while(!q.empty())
{
int u=q.front();q.pop();inq[u]=;
go(i,,n){if(i==u)continue;go(j,,K)
{F=f[j];
if(F[i]>F[u]+g[u][i])F[i]=F[u]+g[u][i],
!inq[i]?q.push(i),inq[i]=:;
if(j&&g[u][i]<=L&&f[j-][i]>F[u])f[j-][i]=F[u],
!inq[i]?q.push(i),inq[i]=:;
}}
}
int ans=inf;go(i,,K)ans=min(ans,f[i][]);printf("%d\n",ans);
}return ;}//Paul_Guderian
那不灭不羁的倔强灵魂,还要经历多少风霜。——汪峰《不经意间》
【Uva 10269 马里奥与公主的归途】的更多相关文章
- UVA 10269 Super Mario,最短路+动态规划
这个题目我昨晚看到的,没什么思路,因为马里奥有boot加速器,只要中间没有城堡,即可不耗时间和脚力,瞬间移动不超过L距离,遇见城堡就要停下来,当然不能该使用超过K次...我纠结了很久,最终觉得还是只能 ...
- uva 10269 最短路
求两次最短路 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> ...
- UVA 10269 Adventure of Super Mario
看了这里 http://blog.csdn.net/acm_cxlove/article/details/8679230的分析之后自己又按照自己的模板写了一遍,算是对spfa又加深了一步认识(以前真是 ...
- UVa 10269 Adventure of Super Mario (Floyd + DP + BFS)
题意:有A个村庄,B个城市,m条边,从起点到终点,找一条最短路径.但是,有一种工具可以使人不费力的移动L个长度,但始末点必须是城市或村庄.这种工具有k个,每个只能使用一次,并且在城市内部不可使用,但在 ...
- UVa 10635 王子和公主(LCS转LIS)
https://vjudge.net/problem/UVA-10635 题意: 有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n^2之间的整数.两个序列的第一个元素均 ...
- UVA 11294 - Wedding(Two-Set)
UVA 11294 - Wedding 题目链接 题意:有n对夫妻,0号是公主.如今有一些通奸关系(男男,女女也是可能的)然后要求人分配在两側.夫妻不能坐同一側.而且公主对面一側不能有两个同奸的人,问 ...
- 儿童节,和 AI 一起通关 “超级马里奥兄弟”
摘要:六一儿童节,快来训练一款自己的游戏 AI,用代码让马里奥从大反派酷霸王的魔掌里救回桃花公主. 本文分享自华为云社区<儿童节,和 AI 一起通关 "超级马里奥兄弟"> ...
- python做小游戏——做个马里奥分分钟解决
一.前言 嗨喽,大家好呀!这里是小熊猫 在你的童年记忆里,是否有一个蹦跳.顶蘑菇的小人已经被遗忘? 马里奥是靠吃蘑菇成长,闻名世界的超级巨星.特征是大鼻子.头戴帽子.身穿背带工作服.还留着胡子.帽子加 ...
- 马里奥AI实现方式探索 ——神经网络+增强学习
[TOC] 马里奥AI实现方式探索 --神经网络+增强学习 儿时我们都曾有过一个经典游戏的体验,就是马里奥(顶蘑菇^v^),这次里约奥运会闭幕式,日本作为2020年东京奥运会的东道主,安倍最后也已经典 ...
随机推荐
- Linux进程管理之task_struct结构体
进程是处于执行期的程序以及它所管理的资源(如打开的文件.挂起的信号.进程状态.地址空间等等)的总称.注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源. ...
- sqlserver之排序规则和ETL不支持sqlserverdatetime2的问题
sqlserver的排序规则大概分为Windows 排序规则和 SQL Server 排序规则.数据在安装的时候,默认不设置会默认为SQL_Latin1_General_CP1_CI_AI.数据库在创 ...
- zookeeper提示Unable to read additional data from server sessionid 0x
配置zookeeper集群,一开始配置了两台机器server.1和server.2. 配置参数,在zoo.cfg中指定了整个zookeeper集群的server编号.地址和端口: server.1=1 ...
- python之路--day13---函数--三元表达式,递归,匿名函数,内置函数-----练习
1.文件内容如下,标题为:姓名,性别,年纪,薪资 egon male 18 3000 alex male 38 30000 wupeiqi female 28 20000 yuanhao female ...
- Linq SelectMany 交叉连接
class Student1 { public int Score { get; set; } public Student1(int score) { this.Score = score; } } ...
- BizTalk Server 2016配置 WCF SAP Adapter
BizTalk Server 2016配置 WCF SAP Adapter 最近公司内部需要使用BizTalk与SAP 系统进行对接,虽然SAP/PI可以以发布WebService 的方式实现与外部系 ...
- 京东2019春招Java工程师编程题题解
生成回文串 题目描述 对于一个字符串,从前开始读和从后开始读是一样的,我们就称这个字符串是回文串. 例如"ABCBA","AA","A"是回 ...
- 在ABPZERO中,扩展实体的方法。
内容 介绍 扩展的抽象实体 将新属性添加给用户 添加迁移 在界面上显示地址 在用户编辑/添加功能中添加地址 扩展的非抽象类实体 获得版本的派生实体 添加迁移 在界面上添加价格 在创建/编辑版本功能中加 ...
- Git撤销commit消息保留修改
有时候commit后发现commit信息错了或者是添加了不想commit的内容,但还没有push到远程仓库 这个时候 git reset --soft [commit_id] 就可以回滚到某一个com ...
- java集合 源码解析 学习手册
学习路线: http://www.cnblogs.com/skywang12345/ 总结 1 总体框架 2 Collection架构 3 ArrayList详细介绍(源码解析)和使用示例 4 fai ...