阿凡卢 发表于 2012-12-13 21:25:02

单源最短路径算法--Dijkstra算法和Bellman-Ford算法

<div id="cnblogs_post_body">Dijkstra算法
算法流程:
(a) 初始化:用起点v到该顶点w的直接边(弧)初始化最短路径,否则设为∞;
(b) 从未求得最短路径的终点中选择路径长度最小的终点u:即求得v到u的最短路径;
(c) 修改最短路径:计算u的邻接点的最短路径,若(v,…,u)+(u,w)<(v,…,w),则以(v,…,u,w)代替。
(d) 重复(b)-(c),直到求得v到其余所有顶点的最短路径。
特点:总是按照从小到大的顺序求得最短路径。
假设一共有N个节点,出发结点为s,需要一个一维数组prev来记录前一个节点序号,一个一维数组dist来记录从原点到当前节点最短路径(初始值为s到Vi的边的权值,没有则为+∞),一个二维数组weights来记录各点之间边的权重,按以上流程更新prev和dist。
参考代码:
<div class="cnblogs_code">#include <iostream>   #include <cstdlib>   using namespace std;    void Dijkstra(int n,int s,int *dist,int *prev,int w[][4]){      int maxint = 65535;      bool *visit = new bool;      for (int i = 0; i < n; i++)      {          dist = w;          visit = false;          if (dist != maxint)          {            prev = s;          }      }      dist = 0;      visit = true;      for (int i = 0; i < n; i++)      {          int temp = maxint;          int u = s;          for (int j = 0; j < n; j++)          {            if ((!visit) && (dist < temp))            {                  u = j;                  temp = dist;            }          }          visit = true;          for (int j = 0; j < n; j++)          {            if (!visit)            {                  int newdist = dist + w;                  if (newdist < dist)                  {                      dist = newdist;                      prev = u;                  }            }          }      }      delete []visit;}    int main(){      int n,v,u;      int weight[4][4]={          0,2,65535,4,          2,0,3,65535,          65535,3,0,2,          4,65535,2,0          };      int q = 0;      int way[4];      int dist[4];      int prev[4];      int s = 1;      int d = 3;      Dijkstra(4, s, dist, prev, weight);      cout<<"The least distance from "<<s<<" to "<<d<<" is "<<dist<<endl;      int w = d;      while (w != s)      {          way++] = prev;          w = prev;      }      cout<<"The path is ";      for (int j = q-1; j >= 0; j--)      {          cout<<way<<" ->";      }      cout<<d<<endl;      return 0;}
页: [1]
查看完整版本: 单源最短路径算法--Dijkstra算法和Bellman-Ford算法