很早之前听说有一种dp是在图上的dp,然后是在跑SPFA的时候进行dp,所以特地找了一题关于在SPFA的时候dp的. 题意:1~a是村庄 a+1~a+b是城堡,存在m条无向边.求由a+b->1的最短路,但是你有很多飞鞋,每双飞鞋可以跑一个固定的距离l,但是跑的时候要是碰到了城堡就要停下来,而且也不能停在路中间. 思路和代码参考了下面的这个网址:http://blog.csdn.net/acm_cxlove/article/details/8679230 思路:正常来说我们就跑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> #…
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 be…
链接:http://vjudge.net/problem/viewProblem.action?id=24902 描述:由城镇.村子和双向边组成的图,从A+B走到1,要求最短路.有K次瞬移的机会,距离不超过L,且不能经过城镇. 思路:一个图上的DP.首先floyd处理,然后做dp. 定义f[i][j]:从1到i还有j次瞬移机会,花费的最少的时间. 状态转移:f[i][j]=min{f[k][j]+dis[k][i],min{f[k][j-1]}} 边界处理:f[1][k]=0 和 f[i][0]…
看了这里 http://blog.csdn.net/acm_cxlove/article/details/8679230的分析之后自己又按照自己的模板写了一遍,算是对spfa又加深了一步认识(以前真是只会用,没想太多). 又来当一次搬运工,一点点进步. 题意是这样的:A个村庄,B个城堡,共有K次穿越的机会,且不能经过城堡或者穿越距离必须不超过L,否则必须停下来,当然,不能再道路中间停下来. 按照大大的思路是这样做的:对于每出队的一个结点u,均有两种方式继续走下去,一中是使用一次穿越,另一种是不使…
题意:有A个村庄,B个城市,m条边,从起点到终点,找一条最短路径.但是,有一种工具可以使人不费力的移动L个长度,但始末点必须是城市或村庄.这种工具有k个,每个只能使用一次,并且在城市内部不可使用,但在村庄内部可使用.另外,在城市或村庄内部的时间不计. 析:先预处理出来使用工具能到达的距离,这个可以用Floyd 来解决,然后f[i][u] 表示到达 u 还剩下 i 次工具未用,然后用bfs就可以很简单的解决. 代码如下: #pragma comment(linker, "/STACK:102400…
题目大意:有A个村庄,B个城市,m条边,从起点到终点,找一条最短路径.但是,有一种工具可以使人不费力的移动L个长度,但始末点必须是城市或村庄.这种工具有k个,每个只能使用一次,并且在城市内部不可使用,但在村庄内部可使用.另外,在城市或村庄内部的时间不计. 题目分析:在城市内部不可使用但在村庄内部可使用的意思就是使用这种工具可以穿过多个村庄(如果长度允许)但不可穿过多个城市,即在使用这种工具的始末点之间可以有多个村庄但不可以有城市,无论始末点是什么.这样,可以先处理出任意两个城市或村庄之间的最短距…
题意:有a个村庄,编号为1到a,有b个城堡,编号为a+1到a+b.现在超级玛丽在a+b处,他的家在1处.每条路是双向的,两端地点的编号以及路的长度都已给出.路的长度和通过所需时间相等.他有一双鞋子,可以使用k次,每次使用后最多可以跑过l的距离,且通过这段距离所需时间为0.使用鞋子时,必须从村庄或城堡开始,到村庄或者城堡结束.但是,城堡充满了陷阱,他如果中途遇见城堡,就必须停下来,且鞋子视为使用完了一次.问超级玛丽回家所需的最短时间. 思路:用floyd算法先处理出任意两点间的最短距离(不用鞋子时…
算是学了图dp后的第一次应用吧.题目其实真的是非常不严谨,什么都没说,基本靠猜,而且严格来说数据应该会有爆int的,不过不管那么多啦,思路对了就好- -0 #include<iostream> #include<cstring> #include<string> #include<cstdio> #include<vector> #include<cmath> #include<queue> #define ll long…
题目连接: 啊哈哈.点我点我 思路: 这个题目是一个图上dp问题.先floyd预处理出图上全部点的最短路,可是在floyd的时候,把可以用神器的地方预处理出来,也就是转折点地方不能为城堡..预处理完成后.就是一个dp问题了. . .dp[][],两维分别表示到达的地点和使用神器的次数.. 这样这个问题就得到了解决.. 题目: ZOJ Problem Set - 1232 Adventure of Super Mario Time Limit: 2 Seconds      Memory Limi…