用邻接矩阵的Dijkstra算法的代码:
int cost[RANGE][RANGE];
int d[RANGE];
bool used[RANGE];
int n,m; //顶点数,边数
void Dijkstra( int s )
{
int i,v,u;
for( i=1; i<=n; ++i )
{
used[i]=false;
d[i]=cost[1][i];
}
d[s]=0;
while( true )
{
v=-1;
for( u=1; u<=n; ++u )
if( !used[u] && ( v==-1 || d[u]<d[v]) )
v=u;
if( v==-1 ) break;
used[v]=true;
for( u=1; u<=n; ++u )
d[u]= min( d[u],d[v]+cost[v][u] );
}
}
使用邻接矩阵实现的dijkstra算法的复杂度是O(V²)。使用邻接表的话,更新最短距离只需要访问每条边一次即可,因此这部分的复杂度是O(E).但是每次要枚举所有的顶点来查找下一个使用的顶点,因此最终复杂度还是O(V²)。在|E|比较小时,大部分的时间都花在了查找下一个使用的顶点上,因此需要使用合适的数据结构进行优化。
需要优化的是数值的插入(更新)和取出最小值两个操作,因