美文网首页
图的应用-最短路径求解

图的应用-最短路径求解

作者: _涼城 | 来源:发表于2020-05-10 08:55 被阅读0次

图的最短路径

  图的最短路径是一个起点到一个终点之间最短的路径。
  用于解决最短路径问题的算法被称做“最短路径算法”, 有时被简称作“路径算法”。

Dijkstra(迪杰斯特拉)算法

介绍

  Dijkstra算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。

实现过程
  1. 初始化一个Final数组,全部设置为0,用于表示节点V_0到某个顶点V_w,是否已经求得了最短路径的标记,如果已有则标记为1;
  2. 声明一个D数组,表示节点V_0到某个顶点V_w的路径;
  3. 声明一个P数组,表示当前结点V_w的前驱顶点的下标;
  4. 初始化 FinalD,P数组;
  5. 初始化min为无穷大,遍历 D 数组 找到对应最小权值min的顶点,记录对应下标k,标记Final[k] = 1,表明找到最短路径;
  6. 之后通过V_k顶点向外扩散找到有关联边的顶点V_w更新D数组,若!final[w] && min + G.arc[k][w] < D[w],则取 min + G.arc[k][w] 更新D[w],更新P[w] = k;
  7. 遍历V_1V_w,重复上两条操作直到final数组全部为1,求得V_0到其他顶点的最短路径。
代码
    /*
    G;网图
    v0: v0开始的顶点
    p[v]:前驱顶点下标
    D[v]:表示从v0到vw的最短路径长度和
   */
  void ShortestPath_Dijkstra(MGraph G, int v0, Patharc *P, ShortPathTable *D)
  {
  int v,w,k,min;
  k = 0;
  int final[MAXVEX];
  final[0] = 1;

  for(v = 0; v < G.numVertexes;v++){
      final[v] = 0;
      (*D)[v] = G.arc[0][v];
      (*P)[v] = 0;
  }
  (*D)[v0] = 0;
  final[v0] = 1;
  (*P)[v0] = -1;

  for (v = 1; v < G.numVertexes; v++)
  {
      min = INFINITYC;
      for (w = 0; w < G.numVertexes; w++)
      {
           if (final[w] != 1 && (*D)[w] < min)
           {
               //下标
               k = w;
               //最小权值 
               min = (*D)[w];
           }
      }
      final[k] = 1;
      for (w = 0; w < G.numVertexes; w++)
      {
          if (final[w] != 1 && min + G.arc[k][w] < ( *D)[w])
          {
              (*D)[w] =  min + G.arc[k][w];
              (*P)[w] =  k;
          }
      }
  }

}

Floyd(弗洛伊德)算法

介绍

  Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,

核心原理
  • 路径矩阵
      通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。
  • 状态转移方程
    D[v,w] = min(D[v,k]+D[k,w],D[v,w])
实现过程
  1. 把图用邻接矩阵D表示出来,定义一个矩阵P用来记录所插入点的信息;
  2. 初始化P,P[v][w]表示从V_vV_w需要经过的点,P[v][w]=w;
  3. 对于每一对顶点 v 和 w,看看是否存在一个顶点 k 使得从 v 到 k 再到 w 比已知的路径更短。如果是更新D[v,w],各个顶点插入图中,比较插点后的距离与原来的距离,D[v][w] = min( D[v][w], D[v][k]+D[k][w] ),如果D[v][w]的值变小,则P[v][w]=k
  4. 在D中包含有两点之间最短道路的信息,而在P中则包含了最短通路径的信息。
代码
 /* 
 Floyd算法,求网图G中各顶点v到其余顶点w的最短路径P[v][w]及带权长度D[v][w]。
 Patharc 和 ShortPathTable 都是二维数组;
 */
void ShortestPath_Floyd(MGraph G, Patharc *P, ShortPathTable *D)
{
    int v,w,k;
    for (v = 0; v < G.numVertexes; v++)
    {
        //把图用邻接矩阵D表示出来
        for (w = 0; w < G.numVertexes; w++)
        {
            //把图用邻接矩阵D表示出来
            (*D)[v][w] = G.arc[v][w];
            //P[v][w]表示从$V_v$到$V_w$需要经过的点,`P[v][w]=w`
            (*P)[v][w] = w;
        } 
    }

    for (k = 0; k < G.numVertexes; k++)
    {
        for (v = 0; v < G.numVertexes; v++)
        {
            for (w = 0; w < G.numVertexes; w++)
            {
                if ((*D)[v][w] > (*D)[v][k] + (*D)[k][w] )
                {
                    (*D)[v][w] = (*D)[v][k] + (*D)[k][w];
                    (*P)[v][w] = k;
                }
            }
        }
    }
}

相关文章

  • 图的应用-最短路径求解

    图的最短路径   图的最短路径是一个起点到一个终点之间最短的路径。  用于解决最短路径问题的算法被称做“最短路径算...

  • 图 求解最短路径 时间复杂度 空间复杂度 单源最短路径 多源最短路径 条数最短(点权为1) 边权之和最小或最大(花...

  • 最短路径 之 Dijkstra 算法

    • 最短路径 之 Floyd 算法• 最短路径 之 Bellman 算法 Dijkstra算法是用于求解单源最短路...

  • 图的最短路径算法(Dijkstra和Floyd)

    最短路径和最小生成树的区别:最短路径解决的是如何求解各顶点之间的路径权值和最小的问题。最小生成树是保证图的所有路径...

  • BFS及其应用

    内容概要: BFS类的实现 BFS求解连通分量 BFS求解无向图点对之间的一条最短路径 BFS判定无环图和二分图 ...

  • 算法和数据结构4.4贝尔曼-福特算法

    贝尔曼-福特算法是一种在图中求解最短路径的问题的算法。 最短路径问题就是加权图在指定了起点和终点的前提下,寻找从起...

  • 力扣1514——概率最大的路径

    本题主要和图的遍历求解最短路径相关,可以用 Dijkstra 或者 Bellman-Ford 算法进行解决。 原题...

  • Bellman-Ford算法

    贝尔曼-福特算法(英语:Bellman–Ford algorithm),求解单源最短路径问题的一种。它的原理是对图...

  • [考研]数据结构必考代码

    (十二)图的遍历 深度优先搜索 广度优先搜索 示例: BFS算法求解非带权图单源最短路径算法: (十三)最小生成树...

  • A星寻路算法-过程可视化

    A*是啥? A*搜索算法,俗称A星算法。通过全局路径节点,求解起始点到目标点的最短路径 ,如果存在最短路径,无论在...

网友评论

      本文标题:图的应用-最短路径求解

      本文链接:https://www.haomeiwen.com/subject/qtudnhtx.html