Dijkstra(迪杰斯特拉算法)常常用于求解图中的单点最短路径问题。其主要实现方法可拆分为两个步骤:①更新距离信息②找出当前最小路径

如下图所示,要求求出1结点到6结点的最短路径。

我们可以先定义一下重点内容:

邻接矩阵map[i][j]:表示i点到j点之间的距离,若两点间无边相连,距离设为无穷大INF(一个很大的数)

数组dis[i],表示从起点到i点的最短路径值

数组vis[i],表示到达i点是否已经被求出最短路径。若为true,则该点相当于位于已选定点集合,若为false,则相当于位于未选定点集合

则初始时,1结点为已访问,即vis[1]=ture,dis[1]=0。其含义为1结点处于已选定点集合,其到其他任意一个结点的距离都为INF。如图:

第一步:更新距离信息:搜索所有处于未选定点集合且与当前结点(1结点)相邻的结点,若新路径的距离加上到达当前结点(1结点)的距离之和小于原有距离,则更新对应dis数组。如图:

此时表格如下:

第二步:找出当前处于未访问状态下dis数组中距离最小的那一个,并将其标记为已访问,即将其放入已选定点集合。下一步则以此结点为起点重复上述步骤。

如表中3结点当前距离最小,则将其放入已选定点集合,即设置vis[3]=T;下一步以3结点为当前结点重复上述第一步。即:搜索与3结点相邻且位于未选定点集合(vis[i]==false)的结点,更新dis数组。

此时,在未选定点集合中,到达4结点距离最短,则将其标记为已访问,下一步再以4结点为起点重复上述步骤,直到所有结点均被访问。

 代码实现:

dij算法部分:

int dij(int n)//默认1是起始点,n是终点
{for (int i = 1;i <= n;i++){dis[i] = map[1][i];//先表示起始点到各点距离,如果没有连接就是inf,这个1是初始点 vis[i]=false;}for (int i = 1;i < n;i++)//除了起始点还有n-1个点要判断{int k = 0;int min = inf;for (int j = 1;j <= n;j++){if (vis[j] == false && dis[j] <= min){min = dis[j];k = j;}}vis[k] = true;//更新距离信息for (int j = 1;j <= n;j++){if (vis[j] == false && dis[k] + map[k][j] < dis[j]){dis[j] = dis[k] + map[k][j];}}}return dis[n];
}

主函数如下:

#include<iostream>
#define inf 0x3f3f3f3f
#define MAXN 10010
using namespace std;
int map[MAXN][MAXN];
int dis[MAXN];
bool vis[MAXN];int dij(int n)//默认了1是起始点,n是终点
{...
}int main()
{int n;cin >> n;//几个结点 for (int i = 1;i <= n;i++){for (int j = 1;j <= n;j++){if (i == j) map[i][j] = 0;else map[i][j] = inf;}}int i, j, d;while (1){cin >> i >> j >> d;if(i==-1) break;map[i][j] = map[j][i] = d;}cout << dij(6) << endl;
}/*
6
1 2 8
1 3 1
2 3 5
2 4 3
3 5 4
3 4 2
4 5 3
4 6 1
5 6 2
-1 -1 -1
*/

另外,若路径起始结点不为1结点,只需为dij函数新增一个变量,并修改对dis数组的初始赋值即可,如下

int dij(int s,int n)//s是起始点,n是终点
{for (int i = 1;i <= n;i++){dis[i] = map[s][i];//仅需修改此处即可 vis[i]=false;}...
}

基于邻接矩阵的dij算法其时间复杂度为O(),因其每次选取距离顶点最近的点需要O(N)的时间,对此,我们可以采用进行优化,使其时间复杂度降到O(logN)。相应题目及代码可参考洛谷 P3371

图中的搜索——dij相关推荐

  1. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)

    对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...

  2. 搜索和遍历在图中有何区别和联系?

    我们都知道有深度/广度优先搜索 和 深度/广度优先遍历,而且都称其为DFS和BFS, 那么他们在图的算法中有什么区别呢?如果没区别那肯定不会是不同的部分吧~ 这篇文章就给出我的一些理解 问题的提出 今 ...

  3. matlab两点之间的所有路径,引用 在图中搜索两点间的所有路径matlab编程

    引用 在图中搜索两点间的所有路径matlab编程 2018-09-18 function possiablePaths = findPath(Graph, partialPath, destinati ...

  4. MIT开发的一款最新Chrome插件,功能远超OCR软件,可快速识别和复制图中文字

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 有时你遇到一篇古老的文献,PDF文档还是扫描版.又或者是遇到一幅网页版海报,上面的 ...

  5. 获得有向无环图中起点到终点的所有路径_力扣1514——概率最大的路径

    本题主要和图的遍历求解最短路径相关,可以用 Dijkstra 或者 Bellman-Ford 算法进行解决. 原题 给你一个由 n 个节点(下标从 0 开始)组成的无向加权图,该图由一个描述边的列表组 ...

  6. 深度搜索问题c语言,C语言实现的图的深度搜索与广度搜索程序.doc

    C语言实现的图的深度搜索与广度搜索程序 C语言实现的图的深度搜索与广度搜索程序 /* 上机试验5-图的建立和遍历 1)建立[无向][非连通]图的邻接表存储结构,要求顶点个数不少于15个. 2)用DFS ...

  7. 图的广度优先搜索(bfs)以及深度优先搜索(dfs)

    1.前言 和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次. 但是图的遍历相对树而言要更为复杂.因为图中的任意顶点都可能与其他顶点相邻,所以在图的遍历中 ...

  8. 【数据结构】图的深度优先搜索

    图的深度优先搜索类似于树的深度优先搜索.不同的是,图中可能包括循环,即我们有可能重复访问节点.为了避免访问已经访问过的节点,我们要使用一个布尔变量的数组. 例如,在下图中,我们从节点2开始访问.当访问 ...

  9. 邻接矩阵实现图的深度优先搜索(1)

    邻接矩阵实现图的深度优先搜索(1) /************************************************************/ /****************** ...

最新文章

  1. jQuery-1.9.1源码分析系列(四) 缓存系统
  2. ajax调取json接口,通过 Ajax 调取后台接口将返回的 json 数据绑定在页面上
  3. 理解Meta Learning 元学习,这篇文章就够了!
  4. NASA艾姆斯研究中心将跟Uber团队展开合作
  5. webstorm 使用svn
  6. ACM模板--链接表 有向图
  7. java面试题二十一 异常
  8. Codeforces 913 二进制背包(柠檬水) 暴力贪心特殊背包(选题)
  9. 2021 ICPC全国邀请赛(西安)太原理工大学收获3枚奖牌
  10. Python数据可视化2.3 体育案例
  11. c语言代码题及答案,c语言编程题精选及答案
  12. linux挂载移动硬盘 格式化_Linux下挂载移动硬盘(NTFS格式)
  13. html css blockquote,css之blockquote美化
  14. Android 双屏显示分析
  15. 元数据管理器中存在错误。 ID 为“DESKTOP-99BPLMI”的 server 中不存在 ID 为“T3DATA_ZYM”的 database,或用户没有访问该对象的权限。
  16. app测试——打印日志
  17. Mac电脑最强截图工具--iShot
  18. os.path.dirname(os.path.realpath(__file__))
  19. Docker将会在Windows和MAC平台本地化
  20. 【松岩盘前视点】2019-9-11

热门文章

  1. 阶段式软件研发项目管理工具
  2. 大漠Android模拟器中控,最新如意大漠多线程中控模板,适用于手游模拟器脚本...
  3. HashSet 集合
  4. oracle查询最新100条数据
  5. whoosh使用简介
  6. SPI 接口OLED 模块 - 兼容5V 和3.3V 电平
  7. 对于公司裁员和转型的无力吐槽
  8. 商城后台管理系统学习日志-02
  9. 网站关键词排名,如何快速提升?
  10. MFRC522模块开发笔记