dijkstra算法C++实现(最短路径)

转载 2018年04月16日 03:39:08
void shortestPaths(int sourceVertex,T* distanceFromSource, int* predecessor)
      {
       //predecessor[i]保存从源定点到达顶点i的路径中前面的那个顶点
       // Find shortest paths from sourceVertex.
       // Return shortest distances in distanceFromSource.
       // Return predecessor information in predecessor.
         if (sourceVertex < 1 || sourceVertex > n)
            throw illegalParameterValue("Invalid source vertex");

         if (!weighted())
            throw undefinedMethod
            ("adjacencyWDigraph::shortestPaths() not defined for unweighted graphs");
         //使用无序链表保存可到达的顶点
         graphChain<int> newReachableVertices;

         // initialize
         //所有邻接于源顶点的顶点i,令predecessor[i] = sourceVertex
         //对所有其他顶点predecessor[i] = -1且predecessor[sourceVertex] = 0
         //创建表newReachableVertices存储所有predecessor[i]>0的顶点(即邻接于源顶点的点)
         for (int i = 1; i <= n; i++)
         {
            distanceFromSource[i] = a[sourceVertex][i];
            if (distanceFromSource[i] == noEdge)
               predecessor[i] = -1;
            else
            {
               predecessor[i] = sourceVertex; 
               newReachableVertices.insert(0, i);
            }
         }
         distanceFromSource[sourceVertex] = 0;
         predecessor[sourceVertex] = 0;  // source vertex has no predecessor

         // update distanceFromSource and predecessor
         while (!newReachableVertices.empty())
         {// more paths exist
            // find unreached vertex v with least distanceFromSource
            chain<int>::iterator iNewReachableVertices
                                 = newReachableVertices.begin();
            chain<int>::iterator theEnd = newReachableVertices.end();
            int v = *iNewReachableVertices;
            iNewReachableVertices++;
            //寻找表中路径最短的边
            while (iNewReachableVertices != theEnd)
            {
               int w = *iNewReachableVertices;
               iNewReachableVertices++;
               if (distanceFromSource[w] < distanceFromSource[v])
                  v = w;
            }

            // next shortest path is to vertex v, delete v from
            // newReachableVertices and update distanceFromSource
            newReachableVertices.eraseElement(v);
            for (int j = 1; j <= n; j++)
            {
               //发现新路径时,更新最短路径。
               if (a[v][j] != noEdge && (predecessor[j] == -1 ||
               distanceFromSource[j] > distanceFromSource[v] + a[v][j]))
               {
                  // distanceFromSource[j] decreases
                  distanceFromSource[j] = distanceFromSource[v] + a[v][j];
                  // add j to newReachableVertices
                  if (predecessor[j] == -1)
                     // not reached before  没在表中时要加入Reach
                     newReachableVertices.insert(0, j);
                  predecessor[j] = v;//保存路径
               }
            }
         }
      }

数据结构与算法——最短路径Dijkstra算法的C++实现

数据结构与算法——最短路径Dijkstra算法的C++实现
  • Linux_ever
  • Linux_ever
  • 2016-05-04 13:26:04
  • 7168

求图中最短路径算法之Dijkstra算法——C++实现并优化

Dijkstra算法是一种比较经典的求图中最短路径算法,它是一种贪心算法,可以求出从源节点到图中其他所有节点的最短路径。适用范围:用于求有向或无向加权图中两点间的最短路径,其中边的权值不能为负。 最...
  • lrgdongnan
  • lrgdongnan
  • 2016-06-25 17:11:45
  • 5302

Dijkstra算法 邻接矩阵 最短路径

  • 2012年12月18日 20:09
  • 4KB
  • 下载

DijkStra最短路径的C++实现与输出路径

一个点(源点)到其余各个顶点的最短路径。也叫做“单源最短路径”Dijkstra。 Dijkstra的主要思想:每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路...
  • u012577585
  • u012577585
  • 2015-04-13 19:34:33
  • 4827

[C++]C++ STL Dijkstra算法 存储多条相同最短路径 shortest path

Dijkstra存储多条相同最短路径使用list结构存储多个顶点(预备)完整源码#include #include using namespace std;int main() { lis...
  • u014786849
  • u014786849
  • 2016-12-31 17:44:58
  • 1113

Dijkstra最短路径算法的C++实现

  • 2011年07月24日 12:10
  • 1008KB
  • 下载

Dijkstra算法求无向图单源最短路径(C语言实现)

  • 2014年06月06日 23:11
  • 6KB
  • 下载

最短路径Dijkstra算法-优先队列优化

#include"cstdio" #include"queue" #include"algorithm" #define INF 1
  • stack_queue
  • stack_queue
  • 2016-08-01 18:41:10
  • 1993

无向图最短路径dijkstra算法

#include using namespace std; const int maxnum = 100; const int maxint = 999999; //Dijkstra(n, ...
  • shadowcw
  • shadowcw
  • 2016-05-19 08:42:48
  • 3804
收藏助手
不良信息举报
您举报文章:dijkstra算法C++实现(最短路径)
举报原因:
原因补充:

(最多只允许输入30个字)