dijkstra算法

算法步骤:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值