叙述

今天终于写到著名的贪心算法——Dijkstra算法了,内心有点激动。

  • 小明的故事

    Dijstra算法对很多人来说看起来比较困难,不是很能理解,其实也没什么啦!
    比如,小明要自己驾车从科技大学去博物馆,考虑到利益上涨油价以及一贫如洗的口袋,小明不能那么任性,来一场说走就走的旅行,所以小明开始像屌丝一样精打细算,寻找一条最短的路径以结束那些不必要的花费。你掏出地图,认真的比较到博物馆去的各种路线,但及其复杂的路网让小明眼花缭乱,一时半会找不到最节省的路线,内心很是烦躁,此时此刻小明掏出口袋里的白将军,狠狠地吸上一口,突然一道光从脑子里闪出来,很快就找到了最短路径。

  • 小明是怎么实现的呢?
    小明想我能不能先找到距离科技大学最近的地标,然后再以这个地标为起点,寻找下一个距离最近的地标,循序渐进,直到找到目的地。因为每次找到的距离都是最近的,所以从始发地到目的地累加起来的距离也是最近的。果然是一个好主意,激动的小明把没抽完的半根白将军狠狠的扔在地上,并用脚摩擦了几下,开始寻找最短路径,很快就找了理想的路线。

  • 小明的灿烂人生
    计算机出身的小明回去以后很快发现了商机,通过自己的聪明才智,开发出了地图软件,挣了好大一笔钱,并用这笔钱投资了国内最大的单身交友平台—CSDN,成为了CSDN的老板,过上了幸福美满的生活。

代码实现

 /*Dijkstra的思路就是:找到与源点权值最小的边,然后再此边找到到其他顶点的最小的边,依次类推,每次找到的都是最小的边最后所得的最短路径长度就是各最小边的和*/#include<iostream>#include<string>#include<stack>using namespace std;#define OK 1#define ERROR 0#define MAXint 32767 //表示无穷大#define MVNum 100  //最大顶点数//邻接矩阵的结构typedef struct{string vexs[MVNum];//顶点表int arcs[MVNum][MVNum];//邻接矩阵,也就是表示边的权值int vexnum, arcnum;//图的顶点数和边的个数}AMGraph;//邻接矩阵的结构//Dijstra结构bool S[MVNum] = { false };//记录从源点到终点是否已被确定最短路径长度int Path[MVNum] = { -1 };//记录终点的直接前驱序号int D[MVNum];//记录最短路径长度//Dijstra结构//查询结点位置int Locate(AMGraph G, string v){for (int i = 0; i < G.vexnum; i++){if (G.vexs[i] == v){return i;}}return -1;}//查询结点位置//创建邻接矩阵int CreateUDN(AMGraph& G)//无向图的构造{cout << "请输入图的顶点数和边数:";cin >> G.vexnum >> G.arcnum;cout << "请输入各点的信息:";for (int i = 0; i < G.vexnum; i++){cin >> G.vexs[i];}for (int i = 0; i < G.vexnum; i++)//初始化边的权值为MAXINT{for (int j = 0; j < G.vexnum; j++){G.arcs[i][j] = MAXint;}}cout << "各边的顶点信息和权值:";for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵{string v1, v2;int w;//边的两个顶点以及权值cin >> v1 >> v2 >> w;int i = Locate(G, v1);//找到点的位置int j = Locate(G, v2);G.arcs[i][j] = w;//赋予权值//G.arcs[j][i] = G.arcs[i][j];}return OK;}//创建邻接矩阵//Dijkstavoid ShortestPath_DIJ(AMGraph G, int v){int n = G.vexnum;//图的节点的数量for (int i = 0; i < n; i++){D[i] = G.arcs[v][i];if (D[i] < MAXint){Path[i] = v;}else{Path[i] = -1;}}S[v] = true;//初始化v已有最短路径D[v] = 0;//最短路径为0for (int i = 1; i < n; i++){int min = MAXint;for (int j = 0; j < n; j++)//找到与v邻接的边的权值最小的{if (!S[j] && D[j] < min){v = j;min = D[j];}}S[v] = true;//找到最短路径for (int k = 0; k < n; k++)//更新从v出发到各顶点的最短路径长度{if (!S[k] && (D[v] + G.arcs[v][k]) < D[k]){D[k] = D[v] + G.arcs[v][k];//更新最短路径长度Path[k] = v;//更改k的前驱为v}}}}//Dijksta//显示最短路径void ShowShortTest(AMGraph G, string v){int s = Locate(G,v);//定位ShortestPath_DIJ(G, s);for (int i = 0; i < G.vexnum; i++){stack<string> sta;//引入栈if (i != s && Path[i] != -1){sta.push(G.vexs[i]);int path = Path[i];while (path != -1){sta.push(G.vexs[path]);path = Path[path];}}if (!sta.empty()){cout << sta.top();sta.pop();}while (!sta.empty()){cout << "->";cout << sta.top();sta.pop();}if (i != s && Path[i] != -1){cout << " 最短路径长度为:" << D[i];cout << endl;}}}//显示最短路径int main(){AMGraph G;CreateUDN(G);string v;cout << "请输入起点:";cin >> v;ShowShortTest(G, v);return 0;}/*v0 v1 v2 v3 v4 v5各边的顶点信息和权值:v1 v2 5 v2 v3 50 v0 v2 10 v0 v4 30 v4 v3 20 v3 v5 10 v0 v5 100 v4 v5 60*/

Dijkstra算法 最短路径相关推荐

  1. Dijkstra算法——最短路径(转)

    转自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算法 1.定义概览 Dijkstra(迪杰斯 ...

  2. Dijkstra算法(最短路径)

    对于网图来说,最短路径,是指起始顶点到末尾顶点之间经过的边上权值之和最小的路径. 带权路径长度-----当图是带权图时,一条路径上所有边的权值之和,称为该路径的带权路径长度. 思路:Dijkstra算 ...

  3. 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...

    问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...

  4. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  5. 【算法】【ACM】深入理解Dijkstra算法(单源最短路径算法)

    Dijkstra算法是用来求解从某个源点到其他各顶点的最短路径(单源最短路径). 下面的Dijkstra算法的讲解都是基于这个有向图,在遇到其他问题可以类比. 算法的基本思想: 把图中的定点分成两组, ...

  6. 判断有向图g中顶点i到顶点j是否有路径_[源码和文档分享]基于Dijkstra算法的最短路径问题求解...

    摘 要 现实生活中许多数据的处理依赖于Dijkstra算法的应用,通过应用Dijkstra算法使复杂问题更加简单化.算法是以起始点为中心向外层层扩展,直到扩展到终点为止,最终求出最短路径.采用Visu ...

  7. Dijkstra算法--有向图的源点到其他顶点的最短路径(连接矩阵、邻接矩阵两种方式)

    引子: Dijkstra算法:某个顶点到其他顶点的最短路径. 以下面这个图为例:其中源点是A.关键点:维护一个二维数组,具体见下面: 1.首先,派一名调查员驻扎在A处,在A处,a调查员能够知道与A相连 ...

  8. dijkstra 算法_最短路径问题Dijkstra算法详解

    1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...

  9. _DataStructure_C_Impl:Dijkstra算法求最短路径

    // _DataStructure_C_Impl:Dijkstra #include<stdio.h> #include<stdlib.h> #include<strin ...

最新文章

  1. Redis 笔记(14)— 持久化及数据恢复(数据持久方式 RDB 和 AOF、数据恢复、混合持久化)
  2. iOS定位服务与地图应用开发:高德地图开发
  3. Unknown CMake command add_compile_definitions
  4. Angular7教程-06-页面与数据交互
  5. js生日计算年龄_JS根据生日算年龄的方法
  6. 如何跳出两层循环嵌套
  7. Apollo配置中心热加载mysql_Apollo 配置中心部署注意事项
  8. Android Studio 使用socks代理
  9. 医用计算机应用基础与实训教程,计算机应用基础与实训教程第1章..ppt
  10. Android Volley
  11. python字符串格式化 说明符顺序_python实践分享:格式化字符串时使用.format方式还是“%”...
  12. 如何在 Mac 上快速输入 Apple 图标?
  13. 【AI视野·今日CV 计算机视觉论文速览 第184期】Thu, 28 May 2020
  14. 高尔顿钉板实验的matlab代码动画演示
  15. 各纬度气候分布图_世界主要气候类型分布模式图39330
  16. 《SoloBug - bug管理系统》-Echarts+Ajax实现图表数据异步加载
  17. CTFshow入门命令执行30
  18. Martin对敏捷宣言中“可工作软件胜过面面俱到文档”的解释
  19. 人气爆棚 航嘉亮相华中科技大学现场
  20. AST介绍和babel插件开发

热门文章

  1. Netty工作笔记0008---NIO的Buffer的机制及子类
  2. JAVA面试要点009---TimeUnit用法
  3. mybatis 主键自增 insert后返回主键
  4. linux应用程序启动时加载库错误问题
  5. endnote参考文献排版_高效管理论文参考文献的方法
  6. verilog学习记(测试和验证)
  7. 多线程的那点儿事(之无锁队列)
  8. 多线程的那点儿事(之避免死锁)
  9. c语言有2维结构体没,c语言结构体说明
  10. jq自动获取html的值,jquery如何获取class值?