图——Dijkstra算法

Dijkstra算法的基本过程
假设路网中每一个节点都有标号,记为vi,i是其编号。D[i]是从起点v0到某点vt的最短路径长度;P[i]表示从v0到vi的最短路径中i点的前一个点的编号。求解从起点v0到终点(或图中任意一点)vt的最短路径算法的基本过程为:

假设路网中每一个节点都有标号 是从出发点s到点t的最短路径长度;表示从s到t的最短路径中t点的前一个点。求解从出发点s到点t的最短路径算法的基本过程为:

  1. 初始化。出发点设置为:

标记起源点s,记k = s,其他所有点设为未标记。

  1. 检验从所有已标记的点k到其他直接连接的未标记的点j的距离,并设置:

  2. 选取下一个点。从所有未标记的点中选取 最小的点i,点i被选为最短路径中的一点,并设为已标记的。

  3. 找到点i的前一点。从已经标记的点集合中找到直接连接到点i的点,并标记为 。

  4. 标记点i。如果所有的点已标记,则算法结束。否则,记k = i,转到2继续。

void ShortestPath_Dijkstra(MGraph G, int v0, Patharc *P, ShortPathTable *D) {
    int v, w, k, min;
    int final[MAXVEX];//final[w]=1表示求得顶点v0到vw的最短路
    for (v = 0; v < G.numVertexes; v++) {
        final[v] = 0;
        (*D)[v] = G.arc[v0][v];
        (*P)[v] = 0;
    }//用于初始化各个点的各种信息
    (*D)[v0] = 0;
    final[v0] = 1;
    for (v = 1; v < G.numVertexes; v++) {
        min = INFINITY;
        for (w = 0; w < G.numVertexes; w++) {
            if (!final[w] && (*D)[w] < min) {
                min = (*D)[w];
                k = w;
            }
        }//在剩下没遍历过的点中,找到距离vi最近的点
        final[k] = 1;//该点已遍历
        for (w = 0; w < G.numVertexes; w++) {
            if (!final[w] && (min + G.arc[k][w] < (*D)[w])) {
                (*D)[w] = min + G.arc[k][w];
                (*P)[w] = k;
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值