求最短路径的三种基本算法

来源:互联网 发布:php判断是否为整数 编辑:程序博客网 时间:2024/05/29 18:44

最短路径

    //代码请翻挑战程序设计

一、Bellman-Ford算法

从原点一层一层扩展更新(像从a能直接到b,则看作b是a的下一层),直到再次遍历所有边时不再有更新,则所有点距原点的最小值确定。

1、用在:在无负圈的单向图求两点最短路径。

2、模板:d[n]:n个点距原点最短路径,初始化INF。(更新对象,下同)

           Struct edge{int from,to,cost;}   存储边。

时间复杂度:O(|V|*|E|)

//还有对其优化的SPFA算法,时间复杂度只有O(|E|)

二、Dijkstra算法

   未确定最短路点集中挑出最短路的点放入已确定最短路点集中,然后在这一点上把下一层值更新,循坏这个操作

,直到未确定最短路点集中没有点(如第一次操作,把原点加入已确定最短路点集中)。

1、用在:在边的权值无负值的单向图求两点最短路径。

2、模板:d[n]:n个点距原点最短路径,初始化INF

         E[n][n]:表示边

 Bool used[n];标志已确定

时间复杂度O(|V|*|V|)

    优化(邻接链表,优先队列)

    邻接链表的使用

    Vector <edge> G[n];

    struct edge{int to,cost};

    每一个struct edge里表示n点到to点的cost(距离)。

 

pair<int ,int>功能pair将一对值组合成一个值,这一对值可以具有不同的数据类型(T1和T2),两个值可以分别用pair的两个公有函数first和second访问。

 

优先队列不说了

 

优化后时间复杂度O(|E|*log|V|)

三、Floyd-Warshall算法

两点间的最短距离只有两种情况:

 1.两点直接连接的距离(两点间的边不一定是直线,也不一定存在)

 2.经过了其它点

  Dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);

  可以看做Dp[i][j]算上了k点,而dp[i][j]是算上了k点之前的最短距离

实现:三重for循环,k最外层,i其次

 

  时间复杂度O(|V|立方)

阅读全文
1 0