一日一题:第一题---Dijkstra求最短路 I(最浅显易懂!)
分享—对于最短路问题的笔记:
戳这里->原题链接
题目描述
给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。
请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。
输入格式
第一行包含整数 n 和 m 。
接下来 m 行每行包含三个整数 x , y , z 表示存在一条从点 x 到点 y 的有向边,边长为 z。
输出格式
输出一个整数,表示 1 号点到 n 号点的最短距离。
如果路径不存在,则输出 −1。
数据范围
1 ≤ n ≤ 500
1 ≤ m ≤ 10^5
图中涉及边长均不超过 10000。
输入样例:
3 3 1 2 2 2 3 1 1 3 4
输出样例:
3
#include<bits/stdc++.h>
using namespace std;const int N=510;
int n,m;
int g[N][N];//输入的边与边的距离
int dist[N];//储存从1号点开始到每条边的距离
bool st[N];//这个点是否被打通(就是是非被当过最优点已被确定过)int dijkstra()
{memset(dist,0x3f3f3f3f,sizeof dist);//先相当于在每个路中间砌一个墙dist[1]=0;for(int i=1;i<n;i++)//除了第一个点,每个点都要被当做一列经历一次遍历{int t=-1;for(int j=1;j<=n;j++)//检查这个点是否为最优点(是否里第一个点最近)看呢条路的墙最容易打通{if(!st[j]&&(t==-1||dist[t]>dist[j]))t=j;}st[t]=true;for(int j=1;j<=n;j++)
//如果被作为最优点,就相当于此点被打通,你就看看通过这个点,到其他点的是否比之前短,如果满足就先作为最短路径先更新进来随后还会进行判断dist[j]=min(dist[j],dist[t]+g[t][j]);if(t==n) break;
//如果我们要查找的n号点已经被更新为最优点就说明最短距离已经被发现(因为咱们边的权值都为正,不可能还有到n最短的了,可以跳出来了)}if(dist[n]==0x3f3f3f3f)return -1;//如果打通的点也无法到达我们要找的n时,就说明到不了了return dist[n];
}
int main()
{scanf("%d%d",&n,&m);memset(g,0x3f,sizeof g);//当时我在想可以不写这个嘛,然后我突然想到,如果你让g默认为0,你从1->2可能会等于1->2->3,哪怕2->3根本没有路,但由于g[2][3]=0,所以路线也可能会更新,所以要设为最大值,就像堵墙档着。for(int i=0;i<m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);if(g[a][b]>c)//因为题目说有重边和自环,所以要更新最优距离g[a][b]=c;//min(g[a][b],c);两种都可以}int s=dijkstra();cout<<s;return 0;
}
查漏补缺:
知识点一:
0x3f: int型的数据是占4个字节,32位,就是 2^32
而0x3f就是 2^6=64,显然是不满足int的需求
0x3f3f3f3f: 就已经是10^9级别的了,一般情况下很少有数据能够超过它,用来表示无穷大足够了
知识点二:
当点数和边数的关系是n的级别,呢我们就可以说这是稀疏图,使用邻接表的方法
当点数和边数的关系是n方的级别,呢我们就可以说这是稠密图,使用邻接矩阵的方法
总结:刚开始被搞得米米,发现了个刷题妙招,不会就敲,再不会就背,不出两天就差不多理解了。
欢迎来到一日一题的小菜鸟频道,睡不着就看看吧!
一日一题:第一题---Dijkstra求最短路 I(最浅显易懂!)相关推荐
- ~~朴素dijkstra算法 (搜索与图论)(附模板题AcWing 849. Dijkstra求最短路 I)
模板 时间复杂是 O(n2+m), n表示点数,m 表示边数 int g[N][N]; // 存储每条边 int dist[N]; // 存储1号点到每个点的最短距离 bool st[N]; // 存 ...
- leetcode剑指offe刷题-第一题-用两个栈实现队列
leetcode剑指offe刷题-第一题 文章目录 leetcode剑指offe刷题-第一题 前言 一.用两个栈实现队列 1.思路 2.代码如下 总结 前言 记录一下自己刷算法的路程. leetcod ...
- 计算机三级 网络技术 大题第一题 答题技巧分享
最近在准备计算机三级网络技术考试,一边刷题,一边看了一些大佬的答题技巧分享,感觉挺有用的,就自己总结了一下给大家分享一下. 这一篇是大题第一题的技巧分享 先放个例题: 拿到题目的第一步,先把子网掩码转 ...
- AcWing 850. Dijkstra求最短路 II
原题链接:AcWing 850. Dijkstra求最短路 II 给定一个 n 个点 m 条边的有向图,图中可能存在 重边 和 自环 ,所有边权均为 非负值 . 请你求出 1 号点到 n 号点的最短距 ...
- Dijkstra AcWing 850. Dijkstra求最短路 II
Dijkstra AcWing 850. Dijkstra求最短路 II 原题链接 AcWing 850. Dijkstra求最短路 II 算法标签 最短路 Dijkstra 思路 图片摘自该题解 图 ...
- 图论入门(一),拓扑排序生成拓扑序列与Dijkstra求最短路
基本知识 Dijkstra基本思想 拓扑排序思维视频讲解 848:有向图的拓扑排序 题目链接 题解: #include<bits/stdc++.h> using namespace std ...
- 堆优化版dijkstra算法:AcWing 850. Dijkstra求最短路 II
堆优化版dijkstra算法分析: 朴素版dijkstra的时间复杂度为O(n^2),主要瓶颈在于第1步的寻找全局最小值的过程. 可以用小根堆(C++STL priority_queue)对dist数 ...
- AcWing 850. Dijkstra求最短路 II【最短路】【堆优化版Dijkstra】
AcWing 850. Dijkstra求最短路 II 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 850. Dijkstra求 ...
- 2018美团点评编程题第一题
晚上参加美团的笔试,今天从坐了一天的车,到了学校匆忙吃了饭,然后就开始了.确实是,脑子有点不灵光. 编程的第一题: 给定一个序列,输出这个序列子串的和为K的倍数的子串的长度,如果有重复,输出最大长度. ...
最新文章
- Auto Machine Learning 自动化机器学习笔记
- Linux redhat 5.4上安装MYDNS
- 编码练习——Java-2-流程控制
- c++primer plus 第11章 编程题第7题
- 玩转oracle 11g(39):oracle11g密码过期后的解决方法
- 解决CodeIgniter大量查询sql时占用内存大问题
- vs2008C1902数据库管理程序不匹配
- 理解Vue的计算属性
- C++ 檔案、資料夾、路徑處理函式庫:boost::filesystem
- There has been an error processing your request[magento1.6]
- html编写个人博客_云开发平台开箱,3分钟零基础搭建个人Hexo博客
- 神舟笔记本电脑进入u启动之BIOS设置方法
- Python单例模式的多种实现方式
- bootstrap重置按钮
- pads图标logo库制作方法
- Could not resolve hostname github: Name or service
- 2的10次方-1的python表达式_第二章PythonⅠ的基本语法,python,I
- 几种常见的软件授权模式
- 实现微信通知提醒的方法总结
- shiro 权限框架
热门文章
- ufo帧率测试网站_技嘉雪鹰3080 VISION OC性能测试
- 中国力量的崛起:扒一扒新一代国际视频编码标准背后的“无限战争”
- 解决Mac 命令行报 “zsh: command not found: adb”
- 【市场营销学三】企业战略与营销管理
- 计算机二级准考证号忘了,怎样查成绩或证明材料听语音
- halcon相机标定助手_HALCON高级篇:单个相机的尺寸测量
- smtp、pop3、IMAP是什么类型的服务器?
- Windows Media Player不能播放rmvb视频解决办法
- Logstash【从无到有从有到无】【L2】Logstash入门
- git新建分支并切换分支