Dijkstra算法

定义:迪克斯特拉算法,是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法
同时这个有权图中不能出现负边。

这里解决单源最短路径问题需要先了解Dijkstra算法,所以这里先把个人对于这个算法的理解附上,再解决最短路问题。


以这个图为例,从1号走到7号的最短路径明显是从1到4再到7,这条路径的权值最小。从代码角度就要利用Dijkstra算法来解释。

因为是从1号开始走,所以把所有与1号直接相连点,都记录下来,从1无法直接走到的点,其权值都暂时标记为无穷大。这时发现能走的点当中,权值最小的路径是走到2号,这个时候就走到2号,并把2号标记为走过。

这个时候,再检索,与1号和2号直接相连的所有点,不是直接相连的的权值暂时都记为无穷。这是5号、3号、4号都是直接相连的,走到这些点的对应权值总和是4、2、3。这里说一下5这个点,到5号权值之所以是4,是因为把2号当成中转站了,也就是1->2->5这么走的。 这里又开始选权值最小的路径,那当然是选1->3这条路,走到3号并把3号标记为走过。

把2号和3号当成中转站,开始检索与1、2、3号直接相连的点,并选出权值最小的路径、并刷新到每个点的权值,(无法直接到点,到那个点的路径权值暂时标记为无穷,意味着暂时走不到) 到5、6、3号的路径权值分别为4、8、3,所以到4号。

来到4号,再重复上述操作,到5、6、7的路径权值分别为4、8、7。所以选7号,走过去。

此时,已经到了目标点7号。但是,所有的点还没走完,所以接着走。
到了这里相信大家都知道该怎么做了,就是照着葫芦画瓢,把走过的路径当成中转站,检索所有可以直接走过去的点、计算出到那个点的权值、选出路径权值最小的一条,去走。最后又开始,调整到每个点的路径权值(因为走了一个点,就又多了一个中转站)

最后,图会呈现这样的状态,而到每个点的路径权值都计算出来了,也记录了到每个点的路径最小权值。
总结一下就是,先检索每个能直接相连的点 (与中转站相连也算直接相连) ,并选出路径权值最小的那个点,走过去,标记那个点走过了,接着把那个点当成中转站,调整一下到每个点的路径权值,无法直接走到的点的路径权值就记为无穷大(意思就是暂时还走不到那个点),如此反复,直到所有点都走过了为止。
因为每次选的都是路径权值最小的,所以到目标点的路径权值一定是最小的。
这里把走过的点当成中转站,是一种理解,也可以把走过的点看成一个整体,当成一个大的点,也可以当成把那个点吞了之类的,怎么好想怎么来吧。

图结构练习——最短路径

Description
给定一个带权无向图,求节点1到节点n的最短路径。
Input
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)
剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。
Output
每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)
Sample
Input

3 2
1 2 1
1 3 1
1 0
Output
1
0

#include<bits/stdc++.h>
#include<string.h>
using namespace std;
#define inf 0x3f3f3f3f
int mp[111][111]; //图
bool vis[111]; //标记是否走过
int point[111]; //用来到某个点需要的权值
void dijkstra(int n)
{int i,j,k,min,u;for(i=1;i<=n;i++) //因为是从1开始 {point[i]=mp[1][i];//先把与1相连的所有的点的权值,都记录下来 }                       //不相连的那些点记录进去的是无穷,但不影响后面的判断,因为是找最小的,所以无穷不影响判断 vis[1]=1; //1点标记为走过了 for(i=1;i<n;i++)//进行n-1次查询 {min=inf;for(j=1;j<=n;j++){if(min>point[j]&&!vis[j]) //那个点没被走过的情况下,开始找最小的权值,并把那个点记录下来 {min=point[j];u=j;}}vis[u]=1;//找到的那个点,标记走过了 for(k=1;k<=n;k++) //开始调整到n个点的权值 {if(!vis[k]&&mp[u][k]<inf&&point[k]>mp[u][k]+point[u]) //在那个点没被走的情况下,从当前点能走到那个点的情况(废话,能走才会走过去) {                                                //把当前记录的权值,与加入新点后走到那个点所需要的权值进行比较,记录小的那个 point[k]=mp[u][k]+point[u];}}}printf("%d\n",point[n]); //最后输出走到n点需要的总权值 } int main(){int n,m;while(~scanf("%d%d",&n,&m)){memset(vis,0,sizeof(vis));//初始化 memset(mp,inf,sizeof(mp)); //先把图中到所有点的步数都记为无穷 memset(point,inf,sizeof(point));for(int i=1;i<=n;i++) //当前点到当前点的步数记为0 {mp[i][i]=0;}while(m--)//开始读入图 {int x,y,z;scanf("%d%d%d",&x,&y,&z);if(mp[x][y]>z)//这里是为了防止路径覆盖 {            //比如说同一条路重复了2次但是路径数不一样,那肯定是记录小的那个 mp[x][y]=mp[y][x]=z;}}dijkstra(n); //把终点传过去 }return 0;}

这里的代码也是参考了学校里的学长和csdn的大佬。
如果你有任何建议或者批评和补充,请留言指出,不胜感激。

图结构练习——最短路径 (Dijkstra算法版)相关推荐

  1. 最短路径Dijkstra算法和Floyd算法整理、

    转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径-Dijkstra算法和Floyd算法 Dijks ...

  2. oj 2143 图结构练习——最短路径的几种算法

    图结构练习--最短路径 Description 给定一个带权无向图,求节点1到节点n的最短路径. Input 输入包含多组数据,格式如下. 第一行包括两个整数n m,代表节点个数和边的个数.(n< ...

  3. 矩阵和图结构(图论) 最短路径问题 学习笔记

    矩阵和图是可以相互转换的,这里的图不仅仅是图片,还包括图结构(图论) 所以最短路径问题解决矩阵和结局图论均是一个问题.

  4. 最短路径—Dijkstra算法和Floyd算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

  5. 图结构练习——最短路径

    题目描述  给定一个带权无向图,求节点1到节点n的最短路径.   输入  输入包含多组数据,格式如下. 第一行包括两个整数n m,代表节点个数和边的个数.(n<=100) 剩下m行每行3个正整数 ...

  6. dijkstra算法和A*算法

    转自: https://www.cnblogs.com/21207-iHome/p/6048969.html#undefined Dijkstra算法 迪杰斯特拉(Dijkstra)算法是典型的最短路 ...

  7. Dijkstra算法和Floyd算法超详解以及区别

    鉴于之前我看到过非常好的博客,如果自己总结的话,大多也是按照别的博主的思路来解释,所以就直接推荐给大家这些优秀的博客: Dijkstra:最短路径dijkstra算法精品代码(超详解) Floyd:F ...

  8. Java图结构-模拟校园地图-迪杰斯特拉(Dijkstra)算法求最短路径 #谭子

    目录目录 一.前言 二.模拟校园地图描述 三.分析题目及相关绘图 四.代码部分 1.GraphNode类 2.Menu类(管理文字) 3.Attraction类 4.AttractionGraph类( ...

  9. 最短路径(Dijkstra算法和Floyd算法)

    最短路径 ​ 在图中,不可避免要解决的一个问题就是计算两点之间的最短路径,对于图结构来说,两个点之间不一定只有一条路径,那么如何才能找出最短的那一条就是图中最短路径问题.最短路径问题在实际生活中应用十 ...

最新文章

  1. 揭示生命的奥秘——生物信息学
  2. 直播 | Python Web开发者的破局之道
  3. 网站推广专员浅析不做大幅修改如何调整网站推广内容?
  4. mysql学习总结一:mysql的安装,介绍,基本命令操作
  5. 题目1063:整数和
  6. mysql对测试如何_我如何对MySQL进行基准测试?
  7. AS星尘粒子系统 初识2
  8. android底部显示不出来,Android studio 底部的状态栏不见了如何显示
  9. 《程序设计导引及在线实践》开始
  10. win10+tensorflow1.14+cuda10安装踩坑
  11. shell学习(一)简单示例help用法
  12. QueryDSL 大于、小于、大于等于、小于等于、等于、不等于方法
  13. 输入一个英文星期的前两个字姆,输出中文星期
  14. CVPR 2022 | 百变发型!中科大/微软/港城大提出HairCLIP:基于文本和参考图像的头发编辑方法...
  15. openwrt mysql改密码_openwrt的路由器重置root密码
  16. 计算机视觉的应用,计算机视觉新手指南
  17. 1103. Integer Factorization (30)
  18. 如何安装微软的Linux发行版CBL-Mariner 1.0
  19. Mysql-binlog的查看
  20. 【SecureCRT】SecureCRT 绝佳配色方案, 保护你的眼睛

热门文章

  1. 【元胞自动机】激进策略元胞自动机三车道(不开放辅路,软件园不影响)交通流模型【含Matlab源码 1296期】
  2. unityt光线透射目标
  3. linux系统的ftp命令大全,linux--ftp命令大全
  4. Queue(队列)-Dequeue(双端队列)-Set-Map及迭代器 等相关方法
  5. 如何将电脑设置为定时关机
  6. 大数据工程师(运维)面试系列
  7. 985211计算机大学名单排名,全国985211大学名单排名
  8. 计算机基础中的分层教学,计算机应用基础分层教学研究
  9. xxx小学四年级(上) 学期
  10. ctl672笔上的两个按键_wacom ctl671压感笔上的两个按键怎么设置成别的东西?