笔记:迪杰斯特拉算法(求给定顶点到各个顶点的最短路径和最小权值)

//该算法简单说就是在图里求给定顶点到各个顶点的最短路径和最小权值。
//过程方法是,遍历并记录起始点到各个顶点的距离,取最小权值邻接点,记录前驱结点。最终生成的结果
//可通过前驱结点找到起点到该顶点的最短路径。
Void Dijkstra(MGraph G,int v,int path[],int dist[]){//参数分别为:图,源点(起点),供保存
//该点到源点最小路径的前驱结点的路径数组,供保存原点到该顶点最短路径的权值
    int s[maxSize];//未找到最短路径的顶点置为0,找到则改为1
    int i,j,min,u;
    for(i=0;i<G.vexnum;i++){//初始处理,记录原点到各个顶点的距离,无路径则为65535
        dist[i]=G.edge[v][i];
        s[i]=0;
        if(G.edge[v][i]<65535) path[i]=v;//若该顶点原点能到达,则将前驱顶点先置为原点
        else path[i]=-1;//否则暂无前驱结点
    }
    s[v]=1;//原点到原点没有最短路径
    path[v]=-1;//没有前驱
    
    for(i=0;i<G.vexnum;i++){//循环查找部分,每次都选择原点能到达其他剩余顶点中权值最小的那
//一个,即找到了原点到该顶点的最小权值,记录前驱结点可逆向找到最短路径
        min=65535;
        for(j=0;j<G.vexnum;j++){//找原点能到达剩余顶点中权值最小的顶点
            if(s[j]==0&&dist[j]<min){
                    u=j;
                    min=dist[j];
            }
        }
        s[u]=1;//已找到
        for(j=0;j<G.vexnum;j++){//根据已确定的顶点,可根据该顶点拓展出到其他剩余顶点的路径
//,所以需要重新比较更新原点到剩余顶点的最小权值
            if(s[j]==0&&dist[u]+G.Edges[u][j]<dist[j]){
                dist[j]=dist[u]+Edges[u][i];//新加入的顶点带来的路径若更小,则修改最小权值
                path[j]=u;//这条较短的路径是由顶点u过来的
            }
        }
    }
}

该算法时间复杂度为O(n^2)。值得注意的是,路径权值不得为负数,不然会导致算法出错。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值