相比于Floyd算法的复杂度,Dijkstra算法的时间复杂度要低很多
同样用邻接矩阵来存储边,用一个一维数组更新起点到其他点的距离,代码如下:
const int maxn=100; const int maxint=0x3fffffff; int A[maxn][maxn];//记录邻接矩阵 int dis[maxn];//记录从起点到各个点的距离 int prev[maxn];//记录每个点可由哪个点到达 bool s[maxn];//记录已经计算过的点 void dijkstra(int v0)//v0即为起点 { int n=maxn; //初始化 for(int i=1;i<=n;i++) { dis[i]=A[v0][i]; s[i]=false; if(dis[i]==maxint)prev[i]=-1; else prev[i]=v0; } s[v0]=true;//起点已经被计算了 int u=v0; //开始搜索除起点外的n-1个点 for(int i=2;i<=n;i++) { //从还没经过计算的点钟找到离起点最近的点 int mindist=maxint; for(int j=1;j<=n;j++) { if(!s[j]&&dist[j]<middist) { u=j; mindist=dist[j]; } } s[u]=true;//此点已经记过计算 for(int j=1;j<=n;j++) { if(!s[j]&&A[u][j]+dist[u]<dist[j])//更新起点到u点连接的点的最短路径 { dist[j]=A[u][j]+dist[u]; prev[j]=u; } } } }