UVA10269 Adventure of Super Mario(Floyd+DP)
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)的更多相关文章
- UVa 10269 Adventure of Super Mario (Floyd + DP + BFS)
题意:有A个村庄,B个城市,m条边,从起点到终点,找一条最短路径.但是,有一种工具可以使人不费力的移动L个长度,但始末点必须是城市或村庄.这种工具有k个,每个只能使用一次,并且在城市内部不可使用,但在 ...
- ZOJ 1232 Adventure of Super Mario (Floyd + DP)
题意:有a个村庄,编号为1到a,有b个城堡,编号为a+1到a+b.现在超级玛丽在a+b处,他的家在1处.每条路是双向的,两端地点的编号以及路的长度都已给出.路的长度和通过所需时间相等.他有一双鞋子,可 ...
- 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] ...
- [题解]UVA10269 Adventure of Super Mario
链接:http://vjudge.net/problem/viewProblem.action?id=24902 描述:由城镇.村子和双向边组成的图,从A+B走到1,要求最短路.有K次瞬移的机会,距离 ...
- UVA-10269 Adventure of Super Mario (dijkstra)
题目大意:有A个村庄,B个城市,m条边,从起点到终点,找一条最短路径.但是,有一种工具可以使人不费力的移动L个长度,但始末点必须是城市或村庄.这种工具有k个,每个只能使用一次,并且在城市内部不可使用, ...
- ZOJ1232 Adventure of Super Mario spfa上的dp
很早之前听说有一种dp是在图上的dp,然后是在跑SPFA的时候进行dp,所以特地找了一题关于在SPFA的时候dp的. 题意:1~a是村庄 a+1~a+b是城堡,存在m条无向边.求由a+b->1的 ...
- UVA 10269 Adventure of Super Mario
看了这里 http://blog.csdn.net/acm_cxlove/article/details/8679230的分析之后自己又按照自己的模板写了一遍,算是对spfa又加深了一步认识(以前真是 ...
- zoj1232Adventure of Super Mario(图上dp)
题目连接: 啊哈哈.点我点我 思路: 这个题目是一个图上dp问题.先floyd预处理出图上全部点的最短路,可是在floyd的时候,把可以用神器的地方预处理出来,也就是转折点地方不能为城堡..预处理完成 ...
- HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
随机推荐
- Sublime Text 3 注册码 激活码 版本号 Build 3143
—– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA ...
- 乌班图 之 Ubuntu 16.04 LTS连接无线上网炒鸡慢问题!!!
用VMware装了Ubuntu 16.04 LTS后连接无线上网,发现出奇的慢. 果断感觉有问题,立马找度娘,果然有问题!!! 网上查找亲测有效的方法为: 在终端运行:sudo gedit /etc/ ...
- LR编写post请求
函数列表: web_submit_data(); web_custom_request(); web_get_int_property(); 1.web_submit_data(); 2.web_cu ...
- luogu P3795 钟氏映射(递推)
题意 n<=107 20MB 题解 也就是给n个点,把他们一个分为一组,或两个分为一组,有多少种方法. 空间大点随便做. 我们靠递推. 一个新点,要不自己一组,要不和前面的一个点构成一组. 所以 ...
- [terry笔记]redhat5.5_11gR2_RAC_安装
redhat5.5_11gR2_RAC_安装,这篇主要记录RAC安装的执行步骤,最烦琐的就是前期配置,到后面图形界面runInstaller,asmca,dbca就很容易了. --hostname检查 ...
- hadoop-13-root ssh无密码登陆
hadoop-13-root ssh无密码登陆 生产机器禁止ROOT远程SSH登录: vi /etc/ssh/sshd_config 把 PermitRootLogin yes 改为 PermitRo ...
- Ordered Broadcast有序广播
sendBroadcast()发生无序广播 sendOrderedBroadcast()发送有序广播 activity_main.xml <LinearLayout xmlns:android= ...
- Homebrew命令具体解释
Homebrew命令具体解释 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 一.安装Homebrew Shell环境下 ...
- POJ 题目3321 Apple Tree(线段树)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21566 Accepted: 6548 Descr ...
- 《鸟哥的Linux私房菜-基础学习篇(第三版)》(三)
第2章 Linxu怎样学习 1. Linux当前的应用角色 当前的Linux常见的应用可略分为企业应用和个人应用双方面. 首先谈了企业环境的利用. 1)网络server. 2)关键任务 ...