zoukankan      html  css  js  c++  java
  • 最短路径个人理解

    陶叔滔滔不绝讲了4种最短路径求法外加一差分方程,没想过他是“好人”,没想到连坏人也不是。我只好自己苦苦煎熬着。

    Dijkstra算法是我喜欢的,不过按一般代码打法,需要大的开销,对于难一点的acm题目,可能会爆掉。它也有优化,对于我们这种小菜鸟来说,有些东西是要记住,不用太死抠的,比如优先队列,它如何如任何机智就不管了,只管用就行了。申明一个typedef pair<int,int> pii,2个值,前者存放从初始点到某点的长度,后者就是此点的端点。再用一下 priority_queue <pii,vector<pii>,greater<pii> > q;这样我们只需要取出它的头,因为它总是将第一个int值即到初始点最小的长度放在最前面,每次取出头,依靠这个点,可以松弛可以通过这个点到达的点的距离。别的就不用管了,由于最短路径的子路径也一定是最短路径,我们已经保证子路径了,所以这个原理一定是正确的。

    再看看谭奎好学长教导鄙人的:SPFA乃神器也。喜欢是放肆,但爱是克制。我迟迟学不会这个算法的原因是我爱的太深沉了!其实看代码,长得和Dijkstra差不多,不过细看你就知道,这里头不是用优先队列,所以它原理也不同,它进行松弛,松弛再松弛,松到最后总会有彩虹的(至于彩虹怎么出来的,我不是很明了。就当做自然现象吧)。用一个队列,当松弛成功的时候,判断一下当前松弛点是否已经在队列里面了,在的话只需更新一下,不在的话就得加入。(这里设了一个标志,在队列里头的话,标记为1,这也是bellman-ford的优化)

    还有一种就是floyd啥算法,一行代码可以搞定。不过效率低,n的立方。它对断点循环的松弛。

    这是我的理解,求中南好学长指导。

  • 相关阅读:
    349. 两个数组的交集
    383. 赎金信
    242. 有效的字母异位词
    844. 比较含退格的字符串
    904. 水果成篮
    剑指offer(9)变态跳台阶
    剑指offer(8)跳台阶
    剑指offer(7)斐波那契数列
    剑指offer(6)旋转数组的最小数字
    剑指offer(5)用两个栈实现队列
  • 原文地址:https://www.cnblogs.com/hhhhhhhhhhhhhhhhhhhhhhhhhhh/p/3878198.html
Copyright © 2011-2022 走看看