Warshall and Floyd/ Prim and Dijkstra-week10

10.1 Warshall:transitive closure-19

沃肖尔算法计算二元关系(或有向图)的传递闭包transitive closure,以矩阵的形式表示。(只有0和1)
如果在图G中有一条从a到z的路径,一条边a, z在图G的传递闭包中
recurrence relation:

19-15

k表示stepping stones,即路径是否经过k这个node。
有两种情况,1.经过上一个垫脚石(k-1)已经有i到j的路径了。2.上一个垫脚石有i到k的路径也有k到j的路径。
19-17 dynamic programming algorithm

19-19

19-22

step:k为x就看第x行和第x列,先找出x列中为1的数,再找出x行中为1的数,将所有列、行的组合都标为1(行列数相同也需要).

Warshall 总结
1.最好,最差,平均时间复杂度都是Θ(n^3)
2.适合dense garphs 稠密图
3.sparse graphs稀疏图最好每个节点轮流做DFS,记录从每个节点轮流到达哪些节点
4.有向图,无向图都可以用

10.2Floyd’s Algorithm: All-Pairs Shortest-Paths

19-35

19-39

Floyd总结
1.Floyd的算法解决了权值为正 positive weights的图的全对最短路径问题all-pairs shortest-path
2.它适用于有向图和无向图。
3.如果节点i与j之间没有边,我们用表达,邻接矩阵的对角线上的元素总是为0
4.“sub-structure” property:全局最优解的局部也是最优解,dynamic programming满足此特质
5.求最短距离可以满足上述特质,最长则不可以

10.3 Prim’s algorithm:finding minimum spanning trees

Greedy Algorithms:局部最优解就是全局最优解的一部分。
Spanning Trees:只使用一部分边连接全部的节点,tree是 a connected graph with no cycle树没有cycle但每个点都能连接

20-12

20-15

organise the nodes that are not yet included in the spanning tree T as a priority queue, organised in a min-heap by edge cost. 以cost为标准构造优先队列
20-17

20-22

prim 总结
1.是greedy algorithm,采用迭代方法
2.使用adjacency lists和a min-heap for the priority queue,我们做了|V|− 1 heap deletions (每次花费Ο log|V|) 和|E| 次updates of priorities (每次花费Ο log|V| ). 时间复杂度为 (|V|−1+|E| )Ο(log |V| ),因为|V|−1<|E|,所以时间复杂度为 Ο(|E| log |V|)

10.4Dijkstra’s algorithm:single-source shortest path tree

与Floyd’s algorithm找所有节点的最短路径不同,Dijkstra只找一条最短路径


20-36

20-41

20-49

虽然已经经过了b,但在从c走的path上不需要加上a到b的weight,如,c到d的weight是10,而不是14

Dijkstra 总结
1.时间复杂度为 Ο(|E| log |V|)
2.与prim不同,Dijkstra在计算下一次最短路径时需要加上上一次的weight
3.最后得到的是shortest-path tree,而不是最短path,path可以不用经过每一个节点。
4.只应用于正权值的图,负权值可以使用Bellman-Ford algorithm

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容