图算法总结

来源:互联网 发布:织梦cms增加前台模块 编辑:程序博客网 时间:2024/06/04 08:34

图算法大体无非两种,广度优先搜索和深度优先搜索。

BFS的应用包括求最短路径,如Dijkstra算法;求最小生成树,如prim和kruskul算法。

它们最大的目标就是求得一颗最小树,或最短路径,或最小生成,总之都是树。

树,最大的特征就是无环。

广度优先搜索BFS:

Dijkstra算法和catch the cow有异曲同工之妙,前者是凡是选过的点(每轮的dist最小的)的dist值就无法更改(没被选过的点其dist值就有变化的可能)——用visit数组标记,后者是踩过的点就不能再踩(避免重复入队,做无用功)——用visit数组标记。这可以保证是无环的——因为不会产生后向边。

注意:没被选过的点其dist值就有变化的可能——每个点的dist值总有定型的时候,那么这个点此时就与最后那个使它dist的值改变的点相连(也唯一与它相连),抛弃前一个使它改变的点而不再与之相连。这保证了不会有不同的路径到达同一个顶点。


仔细分析上图的Dijkstra算法运行过程,就可以发现选择的策略是如何保证无环的——凡是选择过的都被标记,其dist值不可更改!

Dijkstra算法的每个顶点的dist是累计值,表示从源点到此顶点的累加距离,这也是最短距离。而prim算法的每个顶点的 dist 则表示从其前驱到此顶点的距离,

至于kruskul算法只要保证一条边的两个顶点不在同一集合中(如果两个顶点在同一集合中,就抛弃这条边,选择次小边),就可以保证结果无环,又因为每次选择的边都是当前最小的,所以可以保证结果的最小生成树也是正确的。

补充:无权最短路径问题——它是通过用队列和未被发现的结点的dist 用正无穷标记 来保证结果无环的,凡是结点的dist不再是正无穷,就说明已被访问过,从而入队,且其dist值此后一直不可改变(因为只有在入队的时候其dist 值才是改变的),这正是广度优先搜索的最典型应用!


Bellman-Ford算法是通过不断松弛来求最短路径的,而Floyd-Warshall 是动态规划的思想——最优子结构。

另外值得注意的是,Floyd-Warshall 的初始矩阵非相连边是初始化为正无穷还是负无穷,要看求的是最短路径还是最长路径!!!


0 0
原创粉丝点击