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]=min(dp[v][t],dp[u][t-1]) (dis[u][v]<=l)
放进SPFA更新,相当于一个二维的最短路,解决DP在非DAG下的有后效性的问题。
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
#define MAXN 111
#define INF (1<<29) int n,a,b,m,l,k;
int map[MAXN][MAXN],dis[MAXN][MAXN]; void Floyd(){
memcpy(dis,map,sizeof(map));
for(int k=; k<=a; ++k){
for(int i=; i<=n; ++i){
for(int j=; j<=n; ++j){
if(dis[i][k]==INF || dis[k][j]==INF) continue;
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
} struct QNode{
int u,t;
QNode(int _u=,int _t=):u(_u),t(_t){}
};
int dp[MAXN][];
bool vis[MAXN][];
void SPFA(){
memset(vis,,sizeof(vis));
vis[n][]=;
for(int i=; i<=n; ++i){
for(int j=; j<; ++j) dp[i][j]=INF;
}
dp[n][]=;
queue<QNode> que;
que.push(QNode(n,));
while(!que.empty()){
int u=que.front().u,t=que.front().t;
que.pop();
for(int v=; v<=n; ++v){
if(dp[v][t]>dp[u][t]+dis[u][v]){
dp[v][t]=dp[u][t]+dis[u][v];
if(!vis[v][t]){
vis[v][t]=;
que.push(QNode(v,t));
}
}
}
for(int v=; t!=k && v<=n; ++v){
if(dis[u][v]<=l && dp[v][t+]>dp[u][t]){
dp[v][t+]=dp[u][t];
if(!vis[v][t+]){
vis[v][t+]=;
que.push(QNode(v,t+));
}
}
}
vis[u][t]=;
}
} int main(){
int t,u,v,w;
scanf("%d",&t);
while(t--){
scanf("%d%d%d%d%d",&a,&b,&m,&l,&k);
n=a+b;
for(int i=; i<=n; ++i){
for(int j=; j<=n; ++j) map[i][j]=INF;
}
while(m--){
scanf("%d%d%d",&u,&v,&w);
map[u][v]=map[v][u]=min(map[u][v],w);
}
Floyd();
SPFA();
int res=INF;
for(int i=; i<=k; ++i){
res=min(res,dp[][i]);
}
printf("%d\n",res);
}
return ;
}
ZOJ1232 Adventure of Super Mario(DP+SPFA)的更多相关文章
- UVA10269 Adventure of Super Mario(Floyd+DP)
UVA10269 Adventure of Super Mario(Floyd+DP) After rescuing the beautiful princess, Super Mario needs ...
- HDU 4417 Super Mario(线段树)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 4417 Super Mario (划分树)(二分)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- Super Mario(主席树)
Super Mario Mario is world-famous plumber. His “burly” figure and amazing jumping ability reminded ...
- ZOJ1232 Adventure of Super Mario spfa上的dp
很早之前听说有一种dp是在图上的dp,然后是在跑SPFA的时候进行dp,所以特地找了一题关于在SPFA的时候dp的. 题意:1~a是村庄 a+1~a+b是城堡,存在m条无向边.求由a+b->1的 ...
- ZOJ 1232 Adventure of Super Mario (Floyd + DP)
题意:有a个村庄,编号为1到a,有b个城堡,编号为a+1到a+b.现在超级玛丽在a+b处,他的家在1处.每条路是双向的,两端地点的编号以及路的长度都已给出.路的长度和通过所需时间相等.他有一双鞋子,可 ...
- UVa 10269 Adventure of Super Mario (Floyd + DP + BFS)
题意:有A个村庄,B个城市,m条边,从起点到终点,找一条最短路径.但是,有一种工具可以使人不费力的移动L个长度,但始末点必须是城市或村庄.这种工具有k个,每个只能使用一次,并且在城市内部不可使用,但在 ...
- UVA-10269 Adventure of Super Mario (dijkstra)
题目大意:有A个村庄,B个城市,m条边,从起点到终点,找一条最短路径.但是,有一种工具可以使人不费力的移动L个长度,但始末点必须是城市或村庄.这种工具有k个,每个只能使用一次,并且在城市内部不可使用, ...
- ZOJ1027 Travelling Fee(DP+SPFA)
给一张有向无环图,边都有花费,从某点到某点走的那条路径上的那一条花费最多的边可以省掉,问从起点到终点的最少花费的多少, 往DP想的话,就可以写出这个状态dp[u][mx],表示到达u点已经省掉的花费为 ...
随机推荐
- Swift Tour 随笔总结 (4)
Switch的一个例子: let vegetable = "red pepper" switch vegetable { case "celery": let ...
- bmob
移动后台: bmob http://baike.baidu.com/link?url=GHdwJY3cGygcfQDdzosckQnhVy1pvIGZA2Ws0K26lSSFGu7QRX4R1wlo6 ...
- PHP 基础语法实例及注意事项
<?$varint = 1;$varinteger = "test";$varstring = "tes";$varbool = true;$varflo ...
- mysql数据库性能优化(包括SQL,表结构,索引,缓存)
优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当 ...
- (转)SQL Server 中WITH (NOLOCK)浅析
概念介绍 开发人员喜欢在SQL脚本中使用WITH(NOLOCK), WITH(NOLOCK)其实是表提示(table_hint)中的一种.它等同于 READUNCOMMITTED . 具体的功能作用如 ...
- Java for LeetCode 078 Subsets
Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must ...
- codeforces A. Xenia and Divisors 解题报告
题目链接:http://codeforces.com/problemset/problem/342/A 题目意思:给出n个数,找出n/3个组且每组有3个数,这三个数必须要符合两个条件:1.a < ...
- 标准化css属性顺序
前言 对于css文件而言,选择器的写法有它的讲究,如—— 1> 不要用ID选择器 2> 不要用通配符*选择器 3> 选择器的层级 ...... 对于属性值的写法也有他的讲究,如—— ...
- CocoaPods报错及解决方法记录
[!] Oh no, an error occurred. Search for existing GitHub issues similar to yours: https://github.com ...
- Android 图标添加消息提醒
实现方法: 1. 在对应的布局放置TextView或者ImageView. 2. 用Canvas在原来Icon的bitmap基础上进行绘制 3. 利用开源项目ViewBadger进行添加,很方便,而且 ...