POJ2253-Frogger

GerJCS岛 / 2024-10-09 / 原文

继续刷邝斌最短路专题

麻痹的POJ又开始崩溃死好几天了,不挂POJ链接了

洛谷

可用平台

 

这题也没给青蛙跳跃极限啊,如果第一次3 4点5跳不过去咋办?都默认可以跳吗??

洛谷描述有问题,其实青蛙不存在跳跃极限,但题意是说,想找到“若干次跳跃中最长的那一次的距离”最短

 

感觉这题不是迪杰斯特拉了吧,迪杰斯特拉是求最短路径,但这个题不要求最短路径,只要求路径中途两个点尽可能的仅。那如果一步就能到,距离是5,但有条距离为8的显然更远,但如果走8步,每步走1,这却是答案。

学学最短路其他算法吧,感觉应该用多源最短路:Floyd

找到Floyed博客但讲解的不好,三层for的顺序每次都不是最优,刷新后才是最优,但刷新顺序我没理解,按照3层for思路,必定有这步定下后当作伪最优,再走下一步基于这个伪最优,逐步更新找出所有步骤的两点之间最优解,但不明白代码为什么这么写,for的顺序应该不可以换吧。万一伪最优之前还有更优的呢

又看了这个博客,图解非常棒

但发现没一个真正解释清楚的,许多人都是模拟验证他的正确性,但无法解释诸多疑惑,应该从发明算法的发明人角度去推导才好理解啊

 

结合上面那个有棒棒图解博客里的图,进一步阐述算法思路(可以把JeffCoding这人的超链接博客同时开两个标签页,alt+←拖出来,分屏看他的图和我下面的解释)

 

对于所有的距离,当我更新的时候,是把点逐个加入,也就是插进来,插一个点,更新49个距离,再插第二个点,再更新49个距离...最后插入G点,更新49个距离

AA BA CA DA EA FA GA
AB BB CB DB EB FB GB
AC BC CC DC EC FC GC
AD BD CD DD ED FD GD
AE BE CE DE EE FE GE
AF BF CF DF EF FF GF
AG BG CG DG EG FG GG

比如说现在插入A

先拿第3列来说,所有7个距离都变成了,他们分别用自己已有的距离去和 CA+A到他们的距离 做比较取最小。

但此时CA是最优的吗?A到他们是最优的吗?他们已有的是最优的吗?

不用去算,直接看第2步插完A的结论,插A的比如CG应该是CG的本身和CA+AG作比较,取最小,这第2步里的图插完A,CG还是INF呢,显然上面提到的3个都不是最优解,而CG是在之后的插B和插E两次更新的数值,这就是每次更新的思想。

 

但问题来了,能否把中介点,即插入点,放到3个for循环的最里层,也就是floyed可以交换for顺序么。参考博客

详细解释,还是上面那49个距离,遍历插入点for放到最里层,比如现在外层俩for遍历到AD这个点了,最里层for做遍历插入操作,直接一次性遍历插入A~G这几个点,其实就是更新

AA+AD
AB+BD
AC+CD
AD+DD
AE+ED
AF+FD
AG+GD

发现这tmd全是INF啊,算法里插C和F的时候AD距离做的跟新,可现在CF插了没啥用

故此,感觉是不可以换顺序的

 

来看青蛙这个题

 

1 也就我这种笨人这么研究,二哥那种聪明的直接1s想通
View Code

###:

拖出来