算法步骤:
(1)初始化:将源点S到图中各点的直接距离最为初始值记录S到各点的最短距离,不能直接到达记作INF,S到本身的距离为0。
(2)把所有其他除S的点放到集合B中,在所有集合B中遍历一个到S的最短路径距离的点u,并将其在集合B中取出。
(3)由新确定的u点更新S到集合B中一点v的距离为最短。
(4)重复以上2、3两个步骤。
基本思想:设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。
时间复杂度:O(n*n)
空间复杂度(使用邻接矩阵存储时):O(n*n)
void dijkistra(int x)
{
int i,j,k,Min;
fill(used,used+n+1,false);
for(i = 1;i <= n; i++)
d[i] = map[x][i];
d[x]=0;
while(true)
{
int v=-1;
for(int u=0;u<n;u++)
if(!used[u]&&(v==-1||d[u]<d[v])) v=u;
if(v==-1) break;
used[v]=1;
for(int u=0;u<n;u++)
d[u]=min(d[u],d[v]+map[v][u]);
}
}