·马里奥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 马里奥与公主的归途】的更多相关文章

  1. UVA 10269 Super Mario,最短路+动态规划

    这个题目我昨晚看到的,没什么思路,因为马里奥有boot加速器,只要中间没有城堡,即可不耗时间和脚力,瞬间移动不超过L距离,遇见城堡就要停下来,当然不能该使用超过K次...我纠结了很久,最终觉得还是只能 ...

  2. uva 10269 最短路

    求两次最短路 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> ...

  3. UVA 10269 Adventure of Super Mario

    看了这里 http://blog.csdn.net/acm_cxlove/article/details/8679230的分析之后自己又按照自己的模板写了一遍,算是对spfa又加深了一步认识(以前真是 ...

  4. UVa 10269 Adventure of Super Mario (Floyd + DP + BFS)

    题意:有A个村庄,B个城市,m条边,从起点到终点,找一条最短路径.但是,有一种工具可以使人不费力的移动L个长度,但始末点必须是城市或村庄.这种工具有k个,每个只能使用一次,并且在城市内部不可使用,但在 ...

  5. UVa 10635 王子和公主(LCS转LIS)

    https://vjudge.net/problem/UVA-10635 题意: 有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n^2之间的整数.两个序列的第一个元素均 ...

  6. UVA 11294 - Wedding(Two-Set)

    UVA 11294 - Wedding 题目链接 题意:有n对夫妻,0号是公主.如今有一些通奸关系(男男,女女也是可能的)然后要求人分配在两側.夫妻不能坐同一側.而且公主对面一側不能有两个同奸的人,问 ...

  7. 儿童节,和 AI 一起通关 “超级马里奥兄弟”

    摘要:六一儿童节,快来训练一款自己的游戏 AI,用代码让马里奥从大反派酷霸王的魔掌里救回桃花公主. 本文分享自华为云社区<儿童节,和 AI 一起通关 "超级马里奥兄弟"> ...

  8. python做小游戏——做个马里奥分分钟解决

    一.前言 嗨喽,大家好呀!这里是小熊猫 在你的童年记忆里,是否有一个蹦跳.顶蘑菇的小人已经被遗忘? 马里奥是靠吃蘑菇成长,闻名世界的超级巨星.特征是大鼻子.头戴帽子.身穿背带工作服.还留着胡子.帽子加 ...

  9. 马里奥AI实现方式探索 ——神经网络+增强学习

    [TOC] 马里奥AI实现方式探索 --神经网络+增强学习 儿时我们都曾有过一个经典游戏的体验,就是马里奥(顶蘑菇^v^),这次里约奥运会闭幕式,日本作为2020年东京奥运会的东道主,安倍最后也已经典 ...

随机推荐

  1. sqlserver之排序规则和ETL不支持sqlserverdatetime2的问题

    sqlserver的排序规则大概分为Windows 排序规则和 SQL Server 排序规则.数据在安装的时候,默认不设置会默认为SQL_Latin1_General_CP1_CI_AI.数据库在创 ...

  2. 构建自己的 PHP 框架

    这是一个系列的文章,项目地址在这里,欢迎大家star. 这个框架前一部分比较像Yii,后一部分比较像Laravel,因为当时正在看相应框架的源码,所以会有不少借鉴参考.捂脸- 这个框架千万不要直接应用 ...

  3. C# 使用 ffmpeg 进行音频转码

    先放一下 ffmpeg 的官方文档以及下载地址: 官方文档:http://ffmpeg.org/ffmpeg.html 下载地址:http://ffmpeg.org/download.html 用 f ...

  4. Java看书学习笔记

    1.POM:maven ,项目管理工具存放Jar包的文件2.mybatis-generator-core-1.3.2 生成文件 生成语句: java -jar mybatis-generator-co ...

  5. iot会议纪要 20180105

    1.需求概述设备 <-->物接入 <--> 云端认证授权协议解析主题 端点endpoint(地址)->设备thing(用户)->身份principal(密码)-&g ...

  6. Jmeter入门(01)Jmeter的下载和安装

    一.什么是Jmeter 1.一款优秀的.开源的.免费的.功能测试和性能测试 工具 Jmeter ,使用Java开发的一款优秀的开源免费测试工具,主要用来做功能测试和性能测试(压力测试/负载测试),用J ...

  7. javascript学习(3)循环和判断

    continue:: break:: 一.for循环 1.for(i=1;i<6;i++)循环 2.for(x in jsonObject)循环 二.while循环 1.while循环 2.do ...

  8. SSO的全方位解决方案 - Kerberos协议(RFC 1510)

    一.桌面SSO和WEB-SSO的局限性 前面我们的解决方案(桌面SSO和WEB-SSO)都有一个共性:要想将一个应用集成到我们的SSO解决方案中,或多或少的需要修改应用程序. Web应用需要配置一个我 ...

  9. websocketj--随时随地在Web浏览器中操作你的服务端程序

    0 - 有没有觉得Linux标准终端界面输入输出枯燥无味? 1 - 什么?vmstat命令的输出数据不直观?有没有想过能够可视化该命令的输出? 2 - 尝试过用浏览器操作Windows中的cmd吗? ...

  10. Mybatis自动生成Xml文件,针对字段类型为text等会默认产生XXXXWithBlobs的方法问题

    默认情况下产生的Mapper.xml里面存在: 需要修改generatorConfiguration.xml,里面的table加属性,如: <table domainObjectName=&qu ...