问题描述

罗老师被邀请参加一个舞会,是在城市n,而罗老师当前所处的城市为1,附近还有很多城市2~n-1,有些城市之间没有直接相连的路,有些城市之间有直接相连的路,这些路都是双向的,当然也可能有多条。

现在给出直接相邻城市的路长度,罗老师想知道从城市1到城市n,最短多少距离。

输入

输入n, m,表示n个城市和m条路;

接下来m行,每行a b c, 表示城市a与城市b有长度为c的路。

输出

输出1到n的最短路。如果1到达不了n,就输出-1。

样例输入

5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100

样例输出

90

/** 单源最短路径,Dijkstra 算法,邻接矩阵形式,复杂度为O(n^2)
* 求出源 beg 到所有点的最短路径,传入图的顶点数,和邻接矩阵 cost[][]
* 返回各点的最短路径 lowcost[], 路径 pre[].pre[i] 记录 beg 到 i 路径上的 父结点,pre[beg]=-1
* 可更改路径权类型,但是权值必须为非负
*/#include<iostream>
using namespace std;const int MAXN=2010;
#define typec int
const typec INF=0x3f3f3f3f;
bool vis[MAXN];
int pre[MAXN];int cost[MAXN][MAXN],lowcost[MAXN];
void Dijkstra(typec cost[][MAXN],typec lowcost[],int n,int beg){for(int i=0;i<n;i++){lowcost[i]=INF; vis[i]=false; pre[i]=-1; }lowcost[beg]=0;for(int j=0;j<n;j++){int k=-1;int Min=INF;for(int i=0;i<n;i++){if(!vis[i]&&lowcost[i]<Min){Min=lowcost[i];k=i; }}if(k==-1) break;vis[k]=true;for(int i=0;i<n;i++){if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]){lowcost[i]=lowcost[k]+cost[k][i];pre[i]=k;}} }
}
int main(){int m,n;cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(i==j){cost[i][j]=0;}cost[i][j]=INF; }}for(int i=0;i<m;i++){int x,y,w;cin>>x>>y>>w;cost[x-1][y-1]=w;cost[y-1][x-1]=w;}Dijkstra(cost,lowcost,n,0);if(lowcost[n-1]==INF){cout<<-1;}else{cout<<lowcost[n-1];}return 0;
}

本人不才!有待提高!还有一个节点评测未通过,望大佬指点!

Dijkstra是什么?

Dijkstra算法是指定一个源点,求得这个源点到各个点的最短路径。Dijkstra算法通过不断的松弛边,每次更新相邻点的路径,使之两点之间的距离成为最短的路径。Dijkstra算法缺点是不能有负权边的值。

松弛边:点A到点B的距离是10,点A到点C的距离是15,点B到点C的距离是3,那么点A到点C的最短距离就是13。此时15这个值将会被废弃,永不使用,以后谈论点A到点C的距离都是直接说13。这就是松弛边

现在有如下图,6个点,9条边,边是有方向的:

Dijkstra如何走?

假设源点为点(1):

  1. 先求得源点到各个点的距离。则数组为dis['1'=>0, '2'=>1, '3'=>12, '4'=>'∞', '5'=>'∞', '6'=>'∞'];并且用数组e[i][j]表示点i到点j的距离。
  2. 将各个点分为2个部分,P部分是已知的点1到该点距离为最短路径的点的集合,此时P部分只有点1到点1的距离为0是已知的,点1到点2,点1到点3的距离是不是最短路径暂时不可是,所以他们不属于这部分。Q部分是未知的点1到该点距离为最短路径的点的集合。
  3. 在集合Q中选择一个点,这个点距离源点(1)号点最近,即步骤一得出的dis数组中该key所对应的值最小,此时这个点为2号点,因为dis[2]最小,为1。则点1到点2的距离dis[2]是最短的路径,已经已知了,所以将(2)号点加入到集合P中。此时以(2)好点为源点,对所有的边松弛一次,看看有没有一个点X,可以使得点1到点2再到点X的距离小于点1到点X的距离,如果有,则点1到点X的最短路径就是点1到点2再到点X的值。即如果dis[3] > dis[2] + e[2][x],则dis[3] = dis[2] + e[2][x]。
  4. 重复第三步,知道集合Q为空。

第1周笔记5-Dijkstra最短路径问题相关推荐

  1. biostar handbook: 第一周笔记汇总+第二周任务布置

    第一周笔记汇总 昨天和一位也在自学生信的同学交流自学的心境,他在我的唆使之下也在简书更新自己的笔记,可以搜索小郑的学习笔记.期间,他说道 非常庆幸自己能够坚持把自己学到的知识和困惑以文字的形式记录下来 ...

  2. 极客班C++ STL(容器)第二周笔记

    为什么80%的码农都做不了架构师?>>>    极客班 C++ STL (容器算法)第二周笔记 标签(空格分隔): C++ 1. 容器(下) 1.1 Stack a. 概述 Stac ...

  3. LeetCode 505. 迷宫 II(BFS / Dijkstra 最短路径)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 Dijkstra 最短路径 1. 题目 由空地和墙组成的迷宫中有一个球. 球可以向上下左右四个方向滚动,但在遇到墙壁前不会停止滚动. 当球停下 ...

  4. aes算法c语言实现_C语言实现常用数据结构:Dijkstra最短路径算法(第18篇)

    「今天是学习C语言第 161 天」 纸上学来终觉浅,绝知此事要躬行.-- 陆游「冬夜读书示子聿」#题外话算法学习重点是学习如何编程使用它. # Dijkstra算法 Dijkstra算法,中文译名迪杰 ...

  5. Python课程第六周笔记及作业练习

    Python第六周 笔记 作业 练习 笔记 组合数据类型 三种基本数据类型: (1) 集合类型 (2) 序列类型:元组类型和列表类型 (3) 字典类型 集合类型及操作 (1) 集合类型定义 集合是多个 ...

  6. Dijkstra最短路径算法——java代码实现

    具体的算法详解可以看这篇博客Dijkstra最短路径算法详解. 这里我利用.txt文件存储了有向加权图中顶点之间的连接关系以及边上的权重,文件格式如下: 代码所构造的有向加权图如下: package ...

  7. 项目管理Markdown (第二周笔记)

    项目管理Markdown (第二周笔记) 1. 标题大小 输入以下代码 # 第一标题 ## 第二标题 ### 第三标题 #### 第四标题 ##### 第五标题 ###### 第六标题 展示如下 第一 ...

  8. matlab工具箱计算最小生成树_matlab_bgl 图论基本函数库, 相当丰富.包含工具箱、 、Dijkstra最短路径、 254万源代码下载- www.pudn.com...

    文件名称: matlab_bgl下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 7394 KB 上传时间: 2016-03-30 下载次数: 0 详细说明: ...

  9. c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法

    迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本 ...

  10. phtyon第二周笔记

    phtyon的第二周笔记 三月二十四日 三月二十六日 三月二十八日 三月二十四日 给一个半径,求圆的面积和周长. 输入两个数,比较大小后,从小到大打印 依次输入若干个整数,打印出最大值.如果输入为空, ...

最新文章

  1. scala中的部分应用函数和偏函数的区别
  2. Tomcat服务器目录结构
  3. 对 java 同步锁 以及 级别升级的 理解
  4. MQ在计算机组成,[转载]计算机组成框图-计算机运行流程(例子)
  5. 【转】企业开发的困境与变局
  6. Windows中使用http-server搭建一个本地服务
  7. sphinx服务器安装及配置详解
  8. PRCV2018美图短视频实时分类挑战赛落幕,第一名解决方案技术解读
  9. 525、Java工程师的进阶之路 -【 RocketMQ (二)】 2022.01.06
  10. 第四章 06 打印星号
  11. 【数据结构系列】单链表
  12. QQ(微信)一次性发送多条信息(连续发520遍我爱你)
  13. 双语电子商城系统(含小程序) v5.0
  14. 4PAM的误码率仿真
  15. 成都的IT研发产业和芯片产业等情况:2006年初的数据。
  16. 2019-2020 10th BSUIR Open Programming Championship. Semifinal 补题
  17. EfficientNetV2 Smaller Models and Faster Training
  18. 计算机键盘突然不能用了,如果联想笔记本电脑键盘突然无法使用怎么办?
  19. 计算机应用技术简历就业意向,车辆工程专业的应届毕业生简历上就业意向应怎么填?...
  20. Ladybug软件打开pgr格式并且输出jpg格式的全景图

热门文章

  1. python discuz论坛帖子_[Scrapy爬虫实战]Discuz论坛版块内全部帖子获取
  2. 肖像转素描:AI小素的前世今生
  3. getActionCommand()用法
  4. 跟着b站大学学习C语言--哔哩大学计算机学院
  5. Oracle将收购Sun公司
  6. linux服务器扩容lun,FAQ-为什么2288H V5服务器扩容LUN后系统会报错
  7. py.test --pep8 vsearch.py报错解决办法
  8. Word字体的字号与像素对应关系
  9. 在线教育网站的一些瞎折腾……
  10. getElementByTagName