本文介绍的是图的非负权值的单源最短路径问题。问题的提出是,对于有权图D,t提供源点v,要找到从v到其他所有点的最短路径,即单源最短路径问题,在本文中,解决这一问题,是普遍比较熟悉的Dijkstra算法。

算法核心思想参见维基。简而言之,设集合S存放已经求出了最短路径的点。初始状态S中只有一个点v0,之后每求得v0到vn的最短路径,就会更新v0到所有vn邻接的点的一致的最短路径(不一定是最终的最短路径),如此重复,每次会确定v0到一个点的最短路径,确定好的点加入S中,直至所有点进入S结束。在本文中通过visited这一数组来标记相应点是否已经加入S。

以下是代码实现,供参考。其中图的相关部分参见C++ 图的实现:

/*
*单源最短路径:Dijkstra算法
*----By F8Master
*/#include "Graphmtx.h"
#include<stack>
#include<iostream>
using namespace std;#define  DEFAULTPRE '&' //用于标记template<class T,class E>
void Dijkstra(Graphmtx<T,E> &G, E *dist, T *pre, T &s)//G为存储的图,dist是距离数组,pre是其路径中前一个点,s为源点
{int numVertex = G.NumberOfVertices();bool *visited = new bool[numVertex];//标志有木有确定最小距离for (int i =0;i<numVertex;i++)//初始化{ dist[i] = G.getWeight(G.getVertexPos(s),i);if (dist[i]>0 && dist[i]<INF)pre[i] = s;else pre[i] = DEFAULTPRE;}pre[G.getVertexPos(s)] = s;for(int i =0;i<numVertex;i++){visited[i] = false;}int n= G.getVertexPos(s);visited[n] = true;for(int i=1;i<numVertex;i++)//每次找一个点,要找numVertex-1次{E min = INF;int u = -1;for(int j=0;j<numVertex;j++) //找一个距离最小的点{if(visited[j]==false && dist[j]<min){u = j;min = dist[j];       }}if(u > 0){visited[u]=true;for(int k = 0;k<numVertex;k++){if(visited[k]==false && dist[u]+G.getWeight(u,k)<dist[k]){dist[k] = dist[u]+G.getWeight(u,k);pre[k] = G.getValue(u);}}}       }}template<class T,class E >
void showPath(Graphmtx<T,E> &G,T *pre,T &end,T &start)
{stack<T> s;if(end!=start){T v = end;while(v!=start){s.push(v);v = pre[G.getVertexPos(v)];}s.push(v);while(!s.empty()){cout<<s.top()<<" ";s.pop();}}
};
//测试代码
void test_Dijkstra()
{Graphmtx<char,int> G;//T为char,E为intG.inputGraph();int *dist= new int[G.NumberOfVertices()];char *pre = new char[G.NumberOfVertices()];char start;cout<<"输入源点:";cin>>start;Dijkstra(G,dist,pre,start);for(int i = 0;i<G.NumberOfVertices();i++){char end = G.getValue(i);if(end!=start){showPath(G,pre,end,start);cout<<dist[i]<<endl;}     }
}

对于下图,进行测试:

转载于:https://www.cnblogs.com/f8master/p/3826065.html

图的单源最短路径:Dijkstra算法实现相关推荐

  1. 分支限界法:单源最短路径--dijkstra算法

    单源最短路径–dijkstra算法 前面已经多次介绍过dijkstra算法是贪心算法,是动态规划,实际上可以从分支限界的角度来理解: 分支限界法 分支限界法,实际上就是回溯法,一般意义的回溯法是基于深 ...

  2. 数据结构与算法—单源最短路径dijkstra算法

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

  3. 单源最短路径dijkstra算法

    介绍 dijkstra算法也是解决单源最短路径问题的一种方法.它要求图中路径都是非负的.而且,它的效率要高于bellman算法. 实现 首先定义图的结点信息和边信息. struct _Node;typ ...

  4. 单源顶点最短路径java_单源最短路径-Dijkstra 算法

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问题:求a点到各个点的最短距离,如下图 ...

  5. JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法

    一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数.另外,还给定V中的一个顶点,称为源.要计算从源到其他所有各顶点的最短路径长度.这里的长度就是指路上各边权之和.这个问 ...

  6. dijkstra 算法_数据结构与算法—单源最短路径dijkstra算法

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

  7. 单源最短路径---Dijkstra算法

    有这样一道题:在一个图(如图所示)中,一共有四个点:1 2 3 4 这四个点之间各有相连,且每条边都有自己的权值.现在小明在点1上, 他想要到3去,请问最短路径是多少. 很容易得到该图的邻接矩阵.我们 ...

  8. 单源最短路径Dijkstra算法的思想、详细步骤、代码

    目录 一.算法思想 二.算法详细步骤 三.伪代码 + C++代码 四.算法复杂度分析 五.算法改进 六.应用案例 一.算法思想 1.Dijkstra 算法是用来求解单源最短路径问题的经典算法,其本质上 ...

  9. 单源最短路径Dijkstra算法升级:出现多条最短路径,输出之?

    文章目录 引言:单条路径的标配算法 进阶:记录多条路径的改进版Dijkstra算法: 1. 对`P[]`数组进行扩充 2. 求最短路径条数 3. 输出所有最短路径 引言:单条路径的标配算法 一个普通. ...

  10. 单源最短路径(Dijkstra算法)

    题目:http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=208 #include <iostream> #incl ...

最新文章

  1. burpsuite https 社区版_微软推出Visual Studio 2019 RC版 正式版预计四月到来
  2. webpack笔记(2)打包src下的html文件
  3. 剑指offer:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
  4. 嵌入式GUI FTK支持输入法
  5. [vue] 说说你对provide和inject的理解
  6. SharePoint 2010 网站模板要求在网站集中激活功能
  7. 使用socket.io搭建一个实时聊天机器人
  8. centos7 安装 php-fpm_centos7中如何安装 php-fpm(nginx)
  9. 某公司PIX 520防火墙系统和NAT的实施
  10. 前方高能!阿里云双11拼团百团大战已开启!
  11. 如何知道Android机型是32位还是64位
  12. 数据库查询练习(一)
  13. 无所不能的Python竟然没有一个像样的定时器?试试这个!
  14. 生产服务器变慢了排查思路
  15. 【生信】初探基因定位和全基因组关联分析
  16. 信息技术学考 这题不会做!!
  17. 关于win10图标不正常显示的一种解决方法
  18. python——利用nmap进行端口扫描,爆破ftp密码,上传wellshell.
  19. ubuntu安装postgresql并修改数据存储目录
  20. android自动化获取toast,成都汇智动力小强哥系列-Appium中Android自动化怎么获取浮层的toast...

热门文章

  1. IE 下 href 的 BUG
  2. 脏读、不可重复读 共享锁、悲观锁 和 事务五种隔离级别
  3. WebService大讲堂之Axis2(7):将Spring的装配JavaBean发布成WebService
  4. OVS使用笔记(四十三)
  5. leetcode算法题--环形链表 II★
  6. 上高职业技术学校计算机学几年,上高职业技术学校2021年有哪些专业
  7. Apache Hook机制解析(下)——实战:在自己的代码中使用Apache的钩子
  8. Spire.Doc系列教程:C# 根据 Word 的标题样式获取文字
  9. flask教程之创建第一个flask应用
  10. Hyper-V 配置网络 (高级篇)