当初在大学学数据结构这门课的时候,最短路径算法就一直没搞懂,今天碰巧在网上下载了个《数据结构强化班讲义》,看到里面有讲Dijkstra算法,而且还有实现的源码,但是里面并没有讲具体实现原理和步骤,遂到网上搜了一篇介绍Dijsktra算法原理的博文《Dijkstra算法初探》,看了看原理,觉得也没那么难,为什么当初自己就没搞懂呢,归根结底,还是自己太懒,没有探究到底的精神。既然没有那么难,我就想自己来实现一下于是经过半个多小时的编写调试,写出了如下代码,只是为了把算法实现出来,也就并没有做什么优化,写的比较乱。
#include<iostream>
void main()
{
int pathWeight[8][8]={ {0,32000,32000,32000,32000,32000,32000,32000},
{300,0,32000,32000,32000,32000,32000,32000},
{1000,800,0,32000,32000,32000,32000,32000},
{32000,32000,1200,0,32000,32000,32000,32000},
{32000,32000,32000,1500,0,250,32000,32000},
{32000,32000,32000,1000,32000,0,900,1400},
{32000,32000,32000,32000,32000,32000,0,1000},
{1700,32000,32000,32000,32000,32000,32000,0}}; //图的邻接矩阵数组
int i;
int j;
int k;
int originateVec; //出发点
int dist[8]; //出发点到各点的最短距离
int map[8]; //如果map[n]=1;表示出发点到该点的最短距离已确定
int minVec;
int min;
for(i=0;i<8;i++)
{
map[i]=-1;
}
scanf("%d",&originateVec);
map[originateVec]=1;
for(i=0;i<8;i++)
{
dist[i]=pathWeight[originateVec][i];
}
for(i=0;i<8;i++)
{
min=65535;
for(j=0;j<8;j++)
{
if ((dist[j]<min)&&(map[j]!=1))
{
min=dist[j];
minVec=j;
}
}
map[minVec]=1;
for(k=0;k<8;k++)
{
if (dist[k]>(dist[minVec]+pathWeight[minVec][k]))
{
dist[k]=dist[minVec]+pathWeight[minVec][k];
}
}
}
for(i=0;i<8;i++)
{
printf("%d->%d,%d\n",originateVec,i,dist[i]);
}
}