最短路径算法——迪杰斯特拉(Dijkstra)

算法思想

  • 设G=(V,E)是一个带权有向图
  • 把图中顶点集合V分成两组
  • 第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了)
  • 第二组为其余未确定最短路径的顶点集合(用U表示)
  • 按最短路径长度的递增次序依次把第二组的顶点加入S中
  • 在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度
  • 此外,每个顶点对应一个距离,S中的顶点的距离就是从源点v到此顶点的最短路径长度
  • U中的顶点的距离,是从源点v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度

C语言伪代码描述的迪杰斯特拉算法

void ShortestPath_DIJ( MGraph G, int v0, PathMatrix &P, ShortPathTable &D){
    // 用Dijkstra算法求有向网G的v0顶点到其余顶点v的最短路径P[v]及其带权长度D[v]。
    // 若P[v][w]为TRUE,则w是从v0到v当前求得最短路径上的顶点。
    // final[v]为TRUE当且仅当v∈S,即已经求得从v0到v的最短路径。
    for (v = 0; v < G.vexnum; ++ v){
        final[v] = FALSE; D[v] = G.arcs[v0][v];
        for (w = 0; w < G.vexnum; ++ ww) P[v][w] = FALSE;// 设空路径
        if (D[v] < INFINITY) {P[v][v0] = TRUE; P[v][v] = TRUE;}
    }// for
    D[v0] = 0; final[v0] = TRUE;// 初始化,v0顶点属于S集
    // 开始主循环,每次求得v0到某个v顶点的最短路径,并加v到S集
    for (i = 1; i < G.vexnum; ++ i) {// 其余G.vexnum - 1个顶点
        min = INFINITY;// 当前所知离v0顶点的最近距离
        for (w = 0; w < G.vexnum; ++ w)
            if(!final[w])// w顶点在V-S中
                if(D[w] < min) {v = w; min = D[w];}// w顶点离v0顶点更近
        final[v] = TRUE;// 离v0顶点最近的v加入S集
        for(w = 0; w < G.vexnum; ++ w)// 更新当前最短路径及距离
            if(!final[w] && (min + G.arcs[v][w] < D[w])){// 修改D[w]和P[w],x∈V-S
                D[w] = min + G.arcs[v][w];
                P[w] = P[v]; P[w][w] = TRUE;// P[w] = P[v] + P[w]
            }// if
    }// for

}// ShortestPath_DIJ

C语言程序描述的算法

void Dijkstra(float cost[][n], int v){
    // 求源点v到其余顶点的最短路径及其长度,cost为有向网的带权邻接矩阵
    // 设max值为32767,代表一个很大的数
    v1 = v - 1;
    for(i = 0; i < n; i ++){
        dist[i] = cost[v1][i];// 初始化dist
        if(dist[i] < max) pre[i] = v; else pre[i] = 0;
    }
    pre[v1] = 0;
    for(i = 0; i < n; i ++) S[i] = 0;// 第一组开始为空集
    S[v1] = 1;// 源点v并入第一组
    for(i = 0; i < n; i ++){// 扩充第一组
        min = max;
        for(j = 0; j < n; j ++)
            if(!S[j] && (dist[j] < min)) {min = dist[j]; k = j;}
        S[k] = 1;// 将k+1加入第一组
        for(j = 0; j < n; j ++)
            if(!S[j] && (dist[j] > dist[k] + cost[k][j])){// 修正第二组各顶点的距离值
                disk[j] = disk[k] + cost[k][j]; pre[j] = k + 1;// k + 1是j + 1的前趋
            }// 所有顶点均已扩充到S中
        for(j = 0; j < n; j ++){// 打印结果
            printf("%f\n%d", dist[i], i + 1);
            p = pre[i];
            while(p != 0){// 继续找前趋顶点
                printf("<--%d", p);
                p = pre[p - 1];
            }
        }
    }// Dijkstra

}
时间: 2024-10-13 00:50:55

最短路径算法——迪杰斯特拉(Dijkstra)的相关文章

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法 本篇名言:"辛勤的蜜蜂永没有时间悲哀.--布莱克" 这次来看下Dijkstra )算法.还是老方法,先原理,后实现.代码来自网络. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47046031 1.  最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径. 管道铺设.线路安排

最短路径算法——迪杰斯特拉算法(Dijkstra)

图结构中应用的最多的就是最短路径的查找了,关于最短路径查找的算法主要有两种:迪杰斯特拉算法(Dijkstra)和Floyd算法. 其中迪杰斯特拉算法(Dijkstra)实现如下: 原理就是不断寻找当前的最优解: void main() { int V[Max][Max]={0,8,32,Infinity,Infinity, 12,0,16,15,Infinity, Infinity,29,0,Infinity,13, Infinity,21,Infinity,0,7, Infinity,Infi

图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪杰斯特拉算法 求从源点到其余各点的最短路径 依最短路径的长度递增的次序求得各条路径 路径长度最短的最短路径的特点: 在这条路径上,必定只含一条弧,并且这条弧的权值最小. 下一条路径长度次短的最短路径的特点: 它只可能有两种情况:或是直接从源点到该点(只含一条弧):或者是从源点经过顶点v1,再到达该顶

[C++]单源最短路径:迪杰斯特拉(Dijkstra)算法(贪心算法)

1 Dijkstra算法 1.1 算法基本信息 解决问题/提出背景 单源最短路径(在带权有向图中,求从某顶点到其余各顶点的最短路径) 算法思想 贪心算法 按路径长度递增的次序,依次产生最短路径的算法 [适用范围]Dijkstra算法仅适用于[权重为正]的图模型中 时间复杂度 O(n^3) 补充说明 亦可应用于[多源最短路径](推荐:Floyd算法(动态规划,O(n^3))) Dijkstra 时间复杂度:O(n^3) 1.2 算法描述 1.2.1 求解过程(具体思路) 1.2.2 示例 1.2

最短路径之迪杰斯特拉(Dijkstra)算法

对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法.本文先来讲第一种,从某个源点到其余各顶点的最短路径问题. 这是一个按路径长度递增的次序产生最短路径的算法,它的大致思路是这样的. 初始时,S中仅含有源.设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度.D

数据结构之最短路径(1) [迪杰斯特拉算法]

迪杰斯特拉算法介绍: 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想: 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且

最短路径之迪杰斯特拉与双向迪杰斯特拉实验结果

1.  实验数据 数据集:City of Oldenburg (OL) Road Network 9组查询均为相距较远的结点 2. 实验结果一 最近一直在围绕双向迪杰斯特拉转,对其中重要的优先队列数据结构,尝试了用无索引的二叉堆实现.有索引的二叉堆实现以及无索引的斐波那契实现三种方式.其中无索引的优先队列允许出现相同的节点,而有索引的优先队列中不允许.不同实现方式运行时间如表2-1所示,其中每个查询都运行了10000次,单位ms. 表2-1 双向迪杰斯特拉不同优先队列实现方式运行结果 查询 双向

算法-迪杰斯特拉算法(dijkstra)-最短路径

迪杰斯特拉算法(dijkstra)-最短路径 简介: 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想: 设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中

最短路径之迪杰斯特拉算法(Dijkstra)

1.迪杰斯特拉(dijkstra)算法简介 Dijkstra算法是由E.W.Dijkstra于1959年提出,又叫迪杰斯特拉算法,它应用了贪心算法模式, 是目前公认的最好的求解最短路径的方法.算法解决的是有向图中单个源点到其他顶点的最短 路径问题,其主要特点是每次迭代时选择的下一个顶点是标记点之外距离源点最近的顶点.但 由于dijkstra算法主要计算从源点到其他所有点的最短路径,所以算法的效率较低. 2.dijkstra算法基本过程 假设路网中每一个节点都有标号 是从出发点s到点t的最短路径长