图的最短路径算法

最短路径问题的抽象

在网络中(带权图),求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径。

  • 这条路径就是两点之间的最短路径(Shortest Path)
  • 第一个顶点为源点(Source)
  • 最后一个顶点为终点(Destination)

最短路径问题,其实不是一个问题,而是一套问题,这一套问题至少可以分为两大类:

  • 单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径。
    • 无权图
    • 有权图
  • 多源最短路径问题:求任意两顶点间的最短路径。

.
.
.

无权图的单源最短路算法

  • 按照递增的顺序找出到各个顶点的最短路
  • 将BFS搜索算法修改成为无权图单源最短路算法,其中dist[ W ]表示S到W的最短距离。由于dist[] 初始化时可以设置为一个特别的数,所以dist[ W ]还可以用来标识W是否已被访问过。Path[ W ],S到W的路上经过的某顶点
void BFS ( Vertex V ) {
    visited[ V ] = true;
    Enqueue( V, Q );
    while ( !IsEmpty( Q ) ){
        V = Dequeue( Q );
        for ( V的每个邻接点W ){
            if ( !visited[ W ] ){
                visited[ W ] = true;
                Enqueue( W, Q );
            }
        }
    }
}

修改为:

 void Unweighted( Vertex S ){
      Enqueue( S, Q );
      while ( !IsEmpty( Q ) ){
          V = Dequeue( Q );
          for ( V的每个邻接点W ){
              if( dist[ W ] == -1 ){ //如果W被访问过,dist[W]显然不可能为-1
                  dist[ W ] = dist[ V ] + 1;
                  path[ W ] = V;
                  Enqueue( W, Q );
             }
          }
      }
  }

利用Path[ ]和堆栈,可以推出S到D经过的路径。
时间复杂度:T = O(V + E)
.
.
.
.
有权图的单源最短路算法
Dijkstra算法

待续
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值