·马里奥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. bzoj千题计划217:bzoj2333: [SCOI2011]棘手的操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=2333 读入所有数据,先模拟一遍所有的合并操作 我们不关心联通块长什么样,只关心联通块内有谁 所以可以 ...

  2. 第二章 初识JSP

    第二章   初识JSP 一.JSP简述 1.是JSP JSP是指在HTML中嵌入Java脚本语言.全称(Java Server Pages) 当用户通过浏览器访问Web应用时,使用JSP容器对请求的J ...

  3. 20道Java面试必考题

    系统整理了一下有关Java的面试题,包括基础篇,javaweb篇,框架篇,数据库篇,多线程篇,并发篇,算法篇等等,陆续更新中.其他方面如前端后端等等的面试题也在整理中,都会有的. 注:文末有福利!pd ...

  4. python全栈开发-re模块(正则表达式)应用(字符串的处理)

    一.概述 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,要讲他的具体用法要讲一本书!它内嵌在Python中,并通过 re 模块实现.你可以为想要匹配的相应字符串集指定规则:该 ...

  5. NHibernate优点和缺点:

    NHibernate优点: 1.完全的ORM框架. NHibernate对数据库结构提供了较为完整的封装,它将数据库模式映射为较完全的对象模型,支持封装,继续机制,功能较强大,比一般的ORM灵活性高. ...

  6. 谈谈自己的理解:python中闭包,闭包的实质

    闭包这个概念好难理解,身边朋友们好多都稀里糊涂的,稀里糊涂的林老冷希望写下这篇文章能够对稀里糊涂的伙伴们有一些帮助~ 请大家跟我理解一下,如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内 ...

  7. 日推20单词 Day03

    1.occur v. 发生,发现 2.harvest n.收获,丰收 vt.收割,得到 3.crop n.庄稼,收成 4.yield n.产量 v.产出,屈服 5.field n.田野 6.featu ...

  8. Django(博客系统):重写了auth.User后使用createsupperuser出错解决办法

    背景:重写django的系统User后,使用createsupperuser创建用户失败 由于项目需要扩展django默认新的auth.User系统(添加两个字段:头像.简介等字段),因此就重写了dj ...

  9. filter过滤器与map映射

    filter过滤器 >>> list(filter(None,[0,1,2,True,False])) [1, 2, True] filter的作用就是后面的数据按照前面的表达式运算 ...

  10. 对Spring IOC和AOP的理解

    控制反转(IOC)是什么?(理解好Ioc的关键是要明确"谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了") 1.Ioc-Inversion of Contr ...