UVA10269 Adventure of Super Mario(Floyd+DP)

After rescuing the beautiful princess, Super Mario needs to find a way home -- with the princess of course :-) He's very familiar with the 'Super Mario World', so he doesn't need a map, he only needs the best route in order to save time.

There are A Villages and B Castles in the world. Villages are numbered 1..A, and Castles are numbered A+1..A+B. Mario lives in Village 1, and the castle he starts from is numbered A+B. Also, there are two-way roads connecting them. Two places are connected by at most one road and a place never has a road connecting to itself. Mario has already measured the length of every road, but they don't want to walk all the time, since he walks one unit time for one unit distance(how slow!).

Luckily, in the Castle where he saved the princess, Mario found a magic boot. If he wears it, he can super-run from one place to another IN NO TIME. (Don't worry about the princess, Mario has found a way to take her with him when super-running, but he wouldn't tell you :-P)

Since there are traps in the Castles, Mario NEVER super-runs through a Castle. He always stops when there is a castle on the way. Also, he starts/stops super-runnings ONLY at Villages or Castles.

Unfortunately, the magic boot is too old, so he cannot use it to cover more than L kilometers at a time, and he cannot use more than K times in total. When he comes back home, he can have it repaired and make it usable again.

Input

The first line in the input
contains a single integer T, indicating the number of test cases.
(1<=T<=20) Each test case begins with five integers A, B, M, L and K --
the number of Villages, the number of Castles(1<=A,B<=50), the number of
roads, the maximal distance that can be covered at a time(1<=L<=500), and
the number of times the boot can be used. (0<=K<=10) The next M lines
each contains three integers Xi, Yi, Li. That means there is a road connecting
place Xi and Yi. The distance is Li, so the walk time is also Li.
(1<=Li<=100)

Output

For each test case in the input
print a line containing a single integer indicating the minimal time needed to
go home with the beautiful princess. It's guaranteed that Super Mario can
always go home.

Sample Input

1
4 2 6 9 1
4 6 1
5 6 10
4 5 5
3 5 4
2 3 4
1 2 3

Sample Output

9

题目大意

已知A+B个顶点的一张简单图,其中A个顶点标示为村庄,B个顶点标示为城堡,求顶点1到顶点A+B的一条最短路径,但是过程中允许使用K次魔法鞋,每次使用可以在0的时间内移动L个单位,中途遇到城堡将停止魔法,使用魔法鞋的起点和终点都只能是城堡或者村庄。

解题报告

这道题目一开始想到最短路,可是不知道怎么处理使用魔法鞋的情况。在网上看了神犇的博客才知道解法,其实是Floyd+dp 首先,用Floyd处理任意两点间距离,开一个数组,在处理时判断是否能用魔法鞋走,即g[i][j]<=L&&k<=A,那么can[i][j]=1 。然后,再用dp处理。用数组dis[i][k]
表示走到地i个点,用了k次魔法的最小值。状态转移方程为 dis[j][k-1] (i与j之间可用魔法鞋)

$dis[i][k]=min\{\sum\limits_{j=1}^{i-1}dis[j][h]+g[j][i]\}$

初始状态
dis[i][0]=g[s][i] (i=1 to a+b)  
dis[1][i]=0 i=0 to K

最后dis[A+B][K] 即为结果。

#include<queue>
#include <algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define Pair pair<int,int>
#define MAXN 101
#define MAX 99999999
using namespace std;
int t,a,b,m,l,k,g[MAXN][MAXN],can[MAXN][MAXN];
int dis[MAXN][MAXN];
void init()
{
memset(can,,sizeof(can));
memset(g,,sizeof(g));
memset(dis,,sizeof(dis));
scanf("%d%d%d%d%d",&a,&b,&m,&l,&k);
for(int i=;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
g[x][y]=g[y][x]=z;
if(z<=l) can[x][y]=can[y][x]=;
}
}
void floyed()
{
for(int i=;i<=a+b;i++) g[i][i]=;
for(int k=;k<=a+b;k++)
for(int i=;i<=a+b;i++)
for(int j=;j<=a+b;j++)
if(g[i][j]>g[i][k]+g[k][j])
{
g[i][j]=g[i][k]+g[k][j];
if(k<=a&&g[i][j]<=l) can[i][j]=can[j][i]=;
} }
void dp(int s)
{
for(int i=;i<=a+b;i++) dis[i][]=g[s][i];
for(int i=;i<=k;i++) dis[s][i]=;
for(int i=;i<=a+b;i++)
for(int h=;h<=k;h++)
{
int minn=MAX;
for(int j=;j<i;j++)
{
if(can[i][j]) minn=min(minn,dis[j][h-]);
minn=min(minn,dis[j][h]+g[j][i]);
}
dis[i][h]=minn;
}
} int main()
{ scanf("%d",&t);
while(t--)
{
init();
floyed();
dp();
printf("%d\n",dis[a+b][k]);
}
return ;
}

(对于我来说算是个难题了==)

UVA10269 Adventure of Super Mario(Floyd+DP)的更多相关文章

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

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

  2. ZOJ 1232 Adventure of Super Mario (Floyd + DP)

    题意:有a个村庄,编号为1到a,有b个城堡,编号为a+1到a+b.现在超级玛丽在a+b处,他的家在1处.每条路是双向的,两端地点的编号以及路的长度都已给出.路的长度和通过所需时间相等.他有一双鞋子,可 ...

  3. ZOJ1232 Adventure of Super Mario(DP+SPFA)

    dp[u][t]表示从起点出发,到达i点且用了t次magic boot时的最短时间, 方程如下: dp[v][t]=min(dp[v][t],dp[u][t]+dis[u][v]); dp[v][t] ...

  4. [题解]UVA10269 Adventure of Super Mario

    链接:http://vjudge.net/problem/viewProblem.action?id=24902 描述:由城镇.村子和双向边组成的图,从A+B走到1,要求最短路.有K次瞬移的机会,距离 ...

  5. UVA-10269 Adventure of Super Mario (dijkstra)

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

  6. ZOJ1232 Adventure of Super Mario spfa上的dp

    很早之前听说有一种dp是在图上的dp,然后是在跑SPFA的时候进行dp,所以特地找了一题关于在SPFA的时候dp的. 题意:1~a是村庄 a+1~a+b是城堡,存在m条无向边.求由a+b->1的 ...

  7. UVA 10269 Adventure of Super Mario

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

  8. zoj1232Adventure of Super Mario(图上dp)

    题目连接: 啊哈哈.点我点我 思路: 这个题目是一个图上dp问题.先floyd预处理出图上全部点的最短路,可是在floyd的时候,把可以用神器的地方预处理出来,也就是转折点地方不能为城堡..预处理完成 ...

  9. HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

随机推荐

  1. RabbitMq笔记()

    RabbitMq 就是类似于一个数据库样式的操作工具. rabbit解释 有用户名登录密码之类的,还可以创建用户名,创建作用文件之类的. 2. 3.

  2. HDU 1950 Bridging signals【最长上升序列】

    解题思路:题目给出的描述就是一种求最长上升子序列的方法 将该列数an与其按升序排好序后的an'求出最长公共子序列就是最长上升子序列 但是这道题用这种方法是会超时的,用滚动数组优化也超时, 下面是网上找 ...

  3. ActiveMQ学习笔记(4)----JMS的API结构和开发步骤

    1. JMS的API结构 其实上图中的五个API在第一节中我们都已经使用到了.本节将会讲非持久化和持久化topic的使用. 2. JMS的基本开发步骤 1. 创建一个JMS工厂,  Connectio ...

  4. ztree连接数据库,实现下拉菜单

    $(document).ready(function(){ var treeObj = $("#treeDemo"); $.fn.zTree.init(treeObj, setti ...

  5. 模块-- HASH

    模块 HASH   一 MD5 import hashlib h = hashlib.md5() # In [237]: h # Out[237]: <md5 HASH object @ 0x0 ...

  6. BZOJ 2141 排队(CDQ分治)

    我们把每一次交换看做两个插入两个删除.然后就是一个三维偏序.时间一维,下标一维,权值一维. #include<iostream> #include<cstring> #incl ...

  7. C语言运行时数据结构

    段(Segment): 对象文件/可执行文件: SVr4 UNIX上被称为ELF(起初"Extensible Linker Format", 现在"Executable ...

  8. Docker学习总结(12)——非常详细的 Docker 学习笔记

    一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...

  9. dos2unix和unix2dos命令使用【转】

    dos2unix, unix2dos 用来实现 DOS <=> UNIX text file 转换 aptitude install sysutils 行末: DOS 格式 0d 0a U ...

  10. [Angular] Short Imports with TypeScript Path Mapping

    The idea is change from: import {CoreModule} from '../core/core.module'; to: import {CoreModule} fro ...