·马里奥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. 201421123042 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 接口 Comparable Arrays.sort -has a Lambda表达式 1.2尝试使用思维导图将这些关键词组织起来 ...

  2. 使用C#开发Android应用之WebApp

    近段时间了解了一下VS2017开发安卓应用的一些技术,特地把C#开发WebApp的一些过程记录下来, 欢迎大家一起指教.讨论,废话少说,是时候开始表演真正的技术了.. 1.新建空白Android应用 ...

  3. WPF 自定义TextBox带水印控件,可设置圆角

    一.简单设置水印TextBox控件,废话不多说看代码: <TextBox TextWrapping="Wrap" Margin="10" Height=& ...

  4. apigw鉴权分析(1-1)阿里数加 - 鉴权方式分析

    一.访问方式 1.访问阿里云首页 https://www.aliyun.com/?utm_medium=text&utm_source=bdbrand&utm_campaign=bdb ...

  5. Spark:spark df插入hive表后小文件数量多,如何合并?

    在做spark开发过程中,时不时的就有可能遇到租户的hive库目录下的文件个数超出了最大限制问题. 一般情况下通过hive的参数设置: val conf = new SparkConf().setAp ...

  6. POJ-2031 Building a Space Station---MST + 空间距离

    题目链接: https://vjudge.net/problem/POJ-2031 题目大意: 就是给出三维坐标系上的一些球的球心坐标和其半径,搭建通路,使得他们能够相互连通.如果两个球有重叠的部分则 ...

  7. 广度优先(bfs)和深度优先搜索(dfs)的应用实例

    广度优先搜索应用举例:计算网络跳数 图结构在解决许多网络相关的问题时直到了重要的作用. 比如,用来确定在互联网中从一个结点到另一个结点(一个网络到其他网络的网关)的最佳路径.一种建模方法是采用无向图, ...

  8. flask 操作mysql的两种方式-sqlalchemy操作

    flask 操作mysql的两种方式-sqlalchemy操作 二.ORM sqlalchemy操作 #coding=utf-8 # model.py from app import db class ...

  9. with工作原理

    进入时,调用对象的__enter__ 退出时,调用对象的__exit__

  10. 玩转Ecs服务器之搭建Ftp

    以前一直没用过linux,直到阿里搞活动,所以买了台服务器玩玩,熟悉一下linux命令,哈哈. 阿里的官方文档介绍的还是比较详细的,但是你可能还是会遇到一些问题,在这里呢,不推荐配置本地用户的方式,因 ...