dijkstra算法

来源:互联网 发布:网络常用协议的端口号 编辑:程序博客网 时间:2024/06/05 18:51
算法步骤:

(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]);    }}

0 0