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;
}
输出结果为: