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 ...
随机推荐
- 【原创】关于java中的lock
看了下java中高性能锁Lock,其中有如下: ReentrantLock:独占锁,类似于synchronized,不过锁的粒度更小 ReadWriteLock(ReentrantReadWriteL ...
- 【原创】TimeSten安装与配置
1.安装TimeSten 2.安装时要指定TNS_ADMIN_LOCATION,即tnsnames.ora的路径,因为tt会根据这个连接Oracle.C:\TimesTen\tt1122_32\net ...
- (2016北京集训十)【xsy1530】小Q与内存
一道很有意思的神题~ 暴力平衡树的复杂度很对(并不),但是$2^{30}$的空间一脸屎 这题的正解是一个类似线段树的数据结构,我觉得很有创新性Orz 首先可以想到一种暴力就是用一个点代表一个区间,然后 ...
- wget 升级
漏洞描述: Wget是GNU计划开发的一套用于在网络上进行下载的自由软件,是Unix/Linux系统最常用的下载工具,支持通过HTTP.HTTPS以及FTP这三个最常见的TCP/IP协议下载. Wge ...
- 洛谷 P2818 天使的起誓
P2818 天使的起誓 题目描述 Tenshi非常幸运地被选为掌管智慧之匙的天使.在正式任职之前,她必须和其他新当选的天使一样要宣誓.宣誓仪式是每位天使各自表述自己的使命,他们的发言稿放在n个呈圆形排 ...
- JavaScript编写Web脚本最佳实现
最近在看JavaScript DOM 编程艺术,总结一下JavaScript编写Web脚本的规范与实现,对于实现有以下几点要求: 平稳退化:确保网页在没有JavaScript下也能正常运行 分离Jav ...
- android-async-http二次封装和调用
Android android-async-http二次封装和调用 在开发过程中,网络请求这块的使我们常常遇到的一个问题,今天去github 站点上面学习android-async-http,认为还 ...
- nodejs02
Node.js没有根目录的概念,因为它根本没有任何的web容器! 让node.js提供一个静态服务,都非常难! 也就是说,node.js中,如果看见一个网址是 1127.0.0.1:3000/fang ...
- 各大CMS系统优缺点(2017)
各大CMS系统优缺点(2017) 总结 WordPress之前用过,可能需要再完整的用一个才会比较了解. 从2015年各行业建站规模来看,还有一大批人想自己搭建网站,下面为大家盘点一下比较实用CMS系 ...
- DNS解析污染原理——要么修改包,要么直接丢弃你的网络包
DNS/域名解析 可以看到dns解析是最初的一步,也是最重要的一步.比如访问亲友,要知道他的正确的住址,才能正确地上门拜访. dns有两种协议,一种是UDP(默认),一种是TCP. udp 方式,先回 ...