迪杰斯特拉(Dijkstra)算法--(C++实现)

Dijkstra算法描述为:假设用带权邻接矩阵来表示带权有向图。首先引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v到每个终点Vi的最短路径。它的初始状态为:若两顶点之间有弧,则D[i]为弧上的权值;否则置D[i]为无穷大。

(1)找到与源点v最近的顶点,并将该顶点并入最终集合S

(2)根据找到的最近的顶点更新从源点v出发到集合V-S上可达顶点的最短路径距离;

(3)重复以上操作。

以下图中所示的带权有向图为例:

#include <iostream>
#include <sstream>
#define INFINITY  32767
#define VERTEX_NUM 6  //顶点个数

//Dijkstra算法。
//adjMatrix为有向网的带权邻接矩阵。v0为源点。pathMatrix[v][w]为true则v0到v经过w。D[v]为v0到v的距离。
void 
Dijkstra(int adjMatrix[][VERTEX_NUM],int v0,bool pathMatrix[][VERTEX_NUM],int D[])
{
  bool final[VERTEX_NUM];//final[v]=true,则v属于集合S

  for(int v=0;v<VERTEX_NUM;v++)//
  {
    final[v]=false;
    D[v]=adjMatrix[v0][v];
    for(int w=0;w<VERTEX_NUM;w++)
      pathMatrix[v][w]=false;//设空路径
    if(D[v]<INFINITY)
    {
      pathMatrix[v][v0]=true;
      pathMatrix[v][v]=true; 
    }
  }
  pathMatrix[v0][v0]=true;
  D[v0]=0;
  final[v0]=true;//初始化v0属于S集
  
  //开始主循环,每次求得v0到某个顶点v的最短路径,并加v到S
  for(int i=1;i<VERTEX_NUM;i++)//其余VERTEX_NUM-1个顶点
  {
    int minDistance=INFINITY;
    int v;
    for(int w=0;w<VERTEX_NUM;w++)
    { 
      if(final[w]==false)
        if(D[w]<minDistance)
        {
          minDistance=D[w];
          v=w;
        }
    }
    final[v]=true;//v加入S
	
    //更新当前最短路径及距离
    for(int w=0;w<VERTEX_NUM;w++)
    {
      if(final[w]==false&&(minDistance+adjMatrix[v][w]<D[w]))
      {
        D[w]=minDistance+adjMatrix[v][w];
        pathMatrix[w][v]=true;
        pathMatrix[w][w]=true;
      }
    }
  }
}

int main()
{
  //adjMatrix为有向网的带权邻接矩阵。
  int adjMatrix[VERTEX_NUM][VERTEX_NUM]
  ={{INFINITY ,INFINITY ,10 ,INFINITY ,30 ,100 },
    {INFINITY ,INFINITY ,5 ,INFINITY ,INFINITY ,INFINITY },
    {INFINITY ,INFINITY ,INFINITY ,50 ,INFINITY ,INFINITY },
    {INFINITY ,INFINITY ,INFINITY ,INFINITY ,INFINITY ,10 },
    {INFINITY ,INFINITY ,INFINITY ,20 ,INFINITY ,60 },
    {INFINITY ,INFINITY ,INFINITY ,INFINITY ,INFINITY ,INFINITY }};

  bool pathMatrix[VERTEX_NUM][VERTEX_NUM];//pathMatrix[v][w]为true则v0到v经过w。
  int D[VERTEX_NUM];//D[v]为v0到v的距离。
  int vSource=0;//源点
  Dijkstra( adjMatrix,vSource,pathMatrix,D );

  for(int i=0;i<VERTEX_NUM;i++)
  {
    if(vSource==i) continue;
    std::string pathPoint;//源点到其他点的路径点
    for(int j=0;j<VERTEX_NUM;j++)
    {
      if(pathMatrix[i][j])
      {
        std::stringstream ss;//为了将int转为string
        std::string strJ;
        ss<<j;
        ss>>strJ;
        pathPoint+=" v"+strJ;
      } 
    }
    std::cout<<"v0 to v"<<i<<"    distance: "<<D[i]<<"    path point: "<<pathPoint<<std::endl; 
  }
  return 0;
}

输出结果为:


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值