继上一次完成最小生成树后,这次我开始准备最短路径的程序。

最短路分为两种算法,第一个为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条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。

输入描述:

输入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)

输出描述:

输出 一行有两个数, 最短距离及其花费。
示例1

输入

复制

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相关推荐

  1. 拿下斯坦福和剑桥双offer,00后的算法学习之路

    董文馨,00后,精通英语,西班牙语.斯坦福大学计算机系和剑桥大学双Offer,秋季将进入斯坦福大学学习. 10岁开始在国外上学:12岁学Scratch: 13岁学HTML & CSS: 14岁 ...

  2. 好久没有看到这么有建设性德文章,由衷地赞叹《知其所以然地学习(以算法学习为例)》-By 刘未鹏(pongba)

    知其所以然地学习(以算法学习为例) By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) Updated(2008-7-24):更新见正文部分,有标注 ...

  3. 原创 | 初学者友好!最全算法学习资源汇总(附链接)

    在计算机发展飞速的今天,也许有人会问,"今天计算机这么快,算法还重要吗?"其实永远不会有太快的计算机,因为我们总会想出新的应用.虽然在摩尔定律的作用下,计算机的计算能力每年都在飞快 ...

  4. 基本算法学习(一)之希尔排序(JS)

    参考书: 严蔚敏-数据结构 希尔排序(Shell's Sort) 希尔排序又称"缩小增量排序",归属于插入排序一类,简单来说,和我们的插入排序比,它更快. 奇妙的记忆点: 内排序( ...

  5. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  6. Surf算法学习心得(一)——算法原理

    Surf算法学习心得(一)--算法原理 写在前面的话: Surf算法是对Sift算法的一种改进,主要是在算法的执行效率上,比Sift算法来讲运行更快!由于我也是初学者,刚刚才开始研究这个算法,然而网上 ...

  7. 算法学习:后缀自动机

    [前置知识] AC自动机(没有什么关联,但是看懂了会对后缀自动机有不同的理解) [解决问题] 各种子串的问题 [算法学习] 学习后缀自动机的过程中,看到了许多相关性质和证明,但是奈何才疏学浅(lan) ...

  8. 算法学习:后缀数组 height的求取

    [前置知识] 后缀数组 [定义] [LCP]全名最长公共前缀,两个后缀之间的最长前缀,以下我们定义 lcp ( i , j ) 的意义是后缀 i 和 j 的最长前缀 [z函数] 函数z [ i ] 表 ...

  9. 算法学习:最小圆覆盖

    [参考博客] https://www.cnblogs.com/bztMinamoto/p/10698920.html [定义] [圆]一个圆心和他的半径,就能够确定这个半径 [解决问题] 字面意思 给 ...

  10. 算法学习:强连通分量 --tarjan

    [定义] [强连通分量] 在一个子图中,任意点能够直接或者间接到达这个子图中的任意点,这个子图被称为强连通分量 [解决问题] 求图的强连通分量 同时能够起到 ...................缩点 ...

最新文章

  1. 直线职权::参谋职权::职能职权
  2. layui.table.render设置自定义高度高度
  3. extern相关问题
  4. oracle 动态注册和静态注册
  5. 7.深度学习练习:Regularization
  6. python如何画图设置坐标轴_python matplotlib坐标轴设置的方法
  7. MySql error 2003 Can't connect to MySQL server on 'localhost' (0)
  8. “ ModuleNotFoundError: No module named ‘tkinter‘ “的解决方法
  9. flash幻灯片源码
  10. httprunner 2.x学习4-测试用例分层
  11. Topic 19. 临床预测模型之输出每个患者列线图得分 (nomogramFormula)
  12. Deformable DETR进行目标检测,解决size mismatch问题
  13. Python爬虫之爬取实习僧并导入Mysql
  14. 删除文件时提示需要administrator 权限
  15. pdfbox或icepdf转换PDF为图片时,中文乱码(出现方框)处理
  16. react项目里使用public的文件
  17. 网易NEC命名规范笔记
  18. Hadoop详解以及历史版本介绍
  19. 如何有效的降低低功耗设备的功耗
  20. ARM调试原理【调试接口框图】【SWD时序】【SWD主机】

热门文章

  1. Freemarker 最简单的例子程序
  2. XML-RPC 实现C++和C#交互
  3. Milano Store OpenCart 2.0 主题模板 ABC-0473
  4. UltimateAndroid快速开发框架教程
  5. hibernate(五)之继承关系
  6. 改2字节将Win XP Home变成Pro?!(zz)
  7. 狂野!利用Fastjson注入Spring内存马~
  8. RabbitMQ 中的 7 种队列模式,写得太好了!
  9. 真赞!阿里开源的这款分布式事务框架,不愧为民族之光
  10. 太赞了,Intellij IDEA竟然把Java8的数据流问题这么完美的解决掉了!