您的位置:首页 > 其它

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

2017-09-10 19:10 295 查看
最短路径

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

一、Bellman-Ford算法

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

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

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

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

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

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

二、Dijkstra算法

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

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

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

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

         E

:表示边

 Bool used
;标志已确定

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

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

    邻接链表的使用:

    Vector <edge> G
;

    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|立方)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 图论 最短路径