技术部寒假第二次培训(最短路)
路径的概念
- 途径 (walk):途径是连接一连串顶点的边的序列,可以为有限或无限长度。形式化地说,一条有限途径
是一个边的序列 ,使得存在一个顶点序列 满足 ,其中 。这样的途径可以简写为 。通常来说,边的数量 被称作这条途径的 长度(如果边是带权的,长度通常指途径上的边权之和,题目中也可能另有定义)。 - 迹 (trail):对于一条途径
,若 两两互不相同,则称 是一条迹。 - 路径 (path)(又称 简单路径 (simple path)):对于一条迹
,若其连接的点的序列中点两两不同,则称 是一条路径。
单源最短路
Dijkstra算法
算法流程:
- 初始化
,其余结点的 值为正无穷大。 - 找出一个未被标记的、
最小的结点 ,然后标记结点 。 - 扫描结点
的所有出边 ,若 ,则使用 更新 。 - 重复上述2~3的步骤,直到所有结点都被标记。
算法描述:
Dijkstra算法基于贪心思想,他只适用于所有边的长度都是非负数的情况。当边长
给定一张有向图,若对于图中的某一条边
Bellman-Ford算法
基于迭代思想的Bellman-Ford算法流程如下:
- 扫描所有边
,若 ,则用 更新 。 - 重复上述操作,直到所有边都满足三角形不等式(n次就够了)。
该算法的时间复杂度为
Bellman-Ford算法队列优化——SPFA算法
我们发现只有在上一轮扫描中被松弛过的点才有可能更新其他点,所以我们可以用队列维护一下待扩展的点。每次入队相当于完成一次
- 建立一个队列,最初队列中只含有起点1。
- 取出队头结点
,扫描它的所有出边 ,若 ,则更新 。同时若 不在队列中,则把 入队。 - 重复上述步骤直到队列为空。
综合运用
K-[NOIP2009 / 蓝书] 最优贸易_图论基础 (nowcoder.com)
N-[蓝书] 道路和航线_图论基础 (nowcoder.com)
多源最短路
Floyd算法
设
初值为
可以看见,Floyd算法本身就是动态规划。
最终
传递闭包
在交际网络中,给定若干个元素和若干对二元关系,且关系具有传递性。“通过传递性推导出尽量多的元素之间的关系”的问题被称为传递闭包。
例题及简单变形
Q-[蓝书] Sorting It All Out_图论基础 (nowcoder.com)