算法学习--Day9
继上一次完成最小生成树后,这次我开始准备最短路径的程序。
最短路分为两种算法,第一个为Floyd算法,第二个为Dijkstra。
简单来说,Floyd是以点为参照对象,它使用三层循环求解当前图中所有点之间的最短距离。
也就是说,当他的循环处理结束后,你就可以从中找到任意两点之间的最短路径了。
他将大规模问题简化成为若干个子问题,并先对规模小的问题求解出最优值,之后利用规模小的问题的解去递推出大规模问题的解。
核心代码:
for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){for(int k=1;k<=n;k++){if(ans[j][i]==-1 || ans[i][k]==-1) continue; //这句话说明倘若我j-i-k中间有某条路是不通的,这个时候我就不能被更新,所以直接跳过就好if(ans[j][k]==-1 || ans[j][i]+ans[i][k]<ans[j][k]){ ans[j][k]= ans[j][i]+ans[i][k];} //这句话用来更新最小值 } } }
下面我们看dijkstra算法。
题目描述
输入描述:
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。 (1<n<=1000, 0<m<100000, s != t)
输出描述:
输出 一行有两个数, 最短距离及其花费。
输入
复制
3 2 1 2 5 6 2 3 4 5 1 3 0 0
输出
复制
9 11
// // Created by 陈平 on 2018/6/7. // #include "iostream" #include "stdio.h" #include "vector" using namespace std;struct E{int next;int c;int cost;}; vector<E> edge[1001]; int dis[1001]; int cost[1001]; bool mark[1001]; int main(){int n,m;int s,t;while (scanf("%d%d",&n,&m)!=EOF){if(n==0 && m==n) break;for (int i = 1; i <=n ; ++i) {edge[i].clear();}while (m--){int a,b,c,cost;cin>>a>>b>>c>>cost;E tmp;tmp.c = c;tmp.cost = cost;tmp.next = b;edge[a].push_back(tmp);tmp.next = a;edge[b].push_back(tmp);}cin>>s>>t;for (int j = 1; j <=n ; ++j) {dis[j] = -1;mark[j] = false;}dis[s] = 0;cost[s] = 0;mark[s] = true;int newP = s;for (int k = 1; k <n ; ++k) {for (int i = 0; i <edge[newP].size() ; ++i) {int t = edge[newP][i].next;int c = edge[newP][i].c;int co = edge[newP][i].cost;if(mark[t]) continue;if (dis[t]==-1 || dis[t]>dis[newP] + c ||dis[t]==dis[newP] + c && cost[t]>cost[newP]+co ){dis[t] = dis[newP] + c;cost[t] = cost[newP] + co;}}int minn = 1000000;for (int j = 1; j <=n ; ++j) {if(mark[j]) continue;if(dis[j]==-1) continue;if(dis[j] < minn ){minn = dis[j];newP = j;}}mark[newP] = true;}cout<<dis[t]<<" "<<cost[t]<<endl;} }
在写最短路的时候,我们要熟悉使用链表的写法,当数据量增多的时候,使用链表会使节省空间与时间。所以我们要在初始化的时候使用push_back函数把值push进去。而在处理的时候,我们需要分两步去找最优解。第一步为更新当前点集合所连接的点的长度数据。(因为上一步加入了另一个点后我们的长度还未更新)第二步为寻找未在当前集合并且是最短距离的点。(具体流程见我之前的一个博客——https://www.cnblogs.com/Pinging/p/7911169.html)
转载于:https://www.cnblogs.com/Pinging/p/9158775.html
算法学习--Day9相关推荐
- 拿下斯坦福和剑桥双offer,00后的算法学习之路
董文馨,00后,精通英语,西班牙语.斯坦福大学计算机系和剑桥大学双Offer,秋季将进入斯坦福大学学习. 10岁开始在国外上学:12岁学Scratch: 13岁学HTML & CSS: 14岁 ...
- 好久没有看到这么有建设性德文章,由衷地赞叹《知其所以然地学习(以算法学习为例)》-By 刘未鹏(pongba)
知其所以然地学习(以算法学习为例) By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) Updated(2008-7-24):更新见正文部分,有标注 ...
- 原创 | 初学者友好!最全算法学习资源汇总(附链接)
在计算机发展飞速的今天,也许有人会问,"今天计算机这么快,算法还重要吗?"其实永远不会有太快的计算机,因为我们总会想出新的应用.虽然在摩尔定律的作用下,计算机的计算能力每年都在飞快 ...
- 基本算法学习(一)之希尔排序(JS)
参考书: 严蔚敏-数据结构 希尔排序(Shell's Sort) 希尔排序又称"缩小增量排序",归属于插入排序一类,简单来说,和我们的插入排序比,它更快. 奇妙的记忆点: 内排序( ...
- 大顶堆删除最大值_算法学习笔记(47): 二叉堆
堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...
- Surf算法学习心得(一)——算法原理
Surf算法学习心得(一)--算法原理 写在前面的话: Surf算法是对Sift算法的一种改进,主要是在算法的执行效率上,比Sift算法来讲运行更快!由于我也是初学者,刚刚才开始研究这个算法,然而网上 ...
- 算法学习:后缀自动机
[前置知识] AC自动机(没有什么关联,但是看懂了会对后缀自动机有不同的理解) [解决问题] 各种子串的问题 [算法学习] 学习后缀自动机的过程中,看到了许多相关性质和证明,但是奈何才疏学浅(lan) ...
- 算法学习:后缀数组 height的求取
[前置知识] 后缀数组 [定义] [LCP]全名最长公共前缀,两个后缀之间的最长前缀,以下我们定义 lcp ( i , j ) 的意义是后缀 i 和 j 的最长前缀 [z函数] 函数z [ i ] 表 ...
- 算法学习:最小圆覆盖
[参考博客] https://www.cnblogs.com/bztMinamoto/p/10698920.html [定义] [圆]一个圆心和他的半径,就能够确定这个半径 [解决问题] 字面意思 给 ...
- 算法学习:强连通分量 --tarjan
[定义] [强连通分量] 在一个子图中,任意点能够直接或者间接到达这个子图中的任意点,这个子图被称为强连通分量 [解决问题] 求图的强连通分量 同时能够起到 ...................缩点 ...
最新文章
- 直线职权::参谋职权::职能职权
- layui.table.render设置自定义高度高度
- extern相关问题
- oracle 动态注册和静态注册
- 7.深度学习练习:Regularization
- python如何画图设置坐标轴_python matplotlib坐标轴设置的方法
- MySql error 2003 Can't connect to MySQL server on 'localhost' (0)
- “ ModuleNotFoundError: No module named ‘tkinter‘ “的解决方法
- flash幻灯片源码
- httprunner 2.x学习4-测试用例分层
- Topic 19. 临床预测模型之输出每个患者列线图得分 (nomogramFormula)
- Deformable DETR进行目标检测,解决size mismatch问题
- Python爬虫之爬取实习僧并导入Mysql
- 删除文件时提示需要administrator 权限
- pdfbox或icepdf转换PDF为图片时,中文乱码(出现方框)处理
- react项目里使用public的文件
- 网易NEC命名规范笔记
- Hadoop详解以及历史版本介绍
- 如何有效的降低低功耗设备的功耗
- ARM调试原理【调试接口框图】【SWD时序】【SWD主机】
热门文章
- Freemarker 最简单的例子程序
- XML-RPC 实现C++和C#交互
- Milano Store OpenCart 2.0 主题模板 ABC-0473
- UltimateAndroid快速开发框架教程
- hibernate(五)之继承关系
- 改2字节将Win XP Home变成Pro?!(zz)
- 狂野!利用Fastjson注入Spring内存马~
- RabbitMQ 中的 7 种队列模式,写得太好了!
- 真赞!阿里开源的这款分布式事务框架,不愧为民族之光
- 太赞了,Intellij IDEA竟然把Java8的数据流问题这么完美的解决掉了!