最短路径

弗洛伊德算法【全源最短路径】

筅森魡賤 提交于 2020-01-28 01:58:34
弗洛伊德算法 全源最短路径 #include<cstdio> #include<algorithm> using namespace std; const int inf=1000000000; const int maxv=200; int n,m; int dis[maxv][maxv]; void Floyd() { for(int k=0;k<n;k++) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(dis[i][k]!=inf&&dis[k][j]!=inf&&dis[i][k]+dis[k][j]<dis[i][j]) { dis[i][j]=dis[i][k]+dis[k][j]; } } } } } int main() { int u,v,w; fill(dis[0],dis[0]+maxv*maxv,inf); scanf("%d%d",&n,&m); for(int i=0;i<n;i++) { dis[i][i]=0; } for(int i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); dis[u][v]=w; } Floyd(); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { printf("%d ",dis[i][j]

floyd为什么可行?

风格不统一 提交于 2020-01-27 20:37:22
总结 最开始,看到这个算法,感觉代码简洁,好用,就只是把这个板子记住了,但是发现这样的习惯真心不好,所以现在想理解一下 首先 空间复杂度:O(n 2 ) 时间复杂度:O(n 3 ) 作用:多源最短路径 注意:可以处理正负权值,但是不可以处理-负权回路(只会越减越小)-。 当时看了一下这两位大佬的博客 博客园 CSDN 这个算法,我开始有一个疑问,为什么dp[i][j]=min(dp[[i][j],dp[i][k]+dp[k][j]),这样转移一下,就是可行的? 万一当前转移的时候,dp[i][k]和dp[k][j]都不是最小的,这样转移的话,dp[i][j]就不是最小的,最终却是可行的! 首先A: memset ( dp , inf , sizeof ( dp ) ) ; for ( int i = 1 ; i <= n ; i ++ ) for ( int j = 1 ; j <= n ; j ++ ) if ( i == j ) dp [ i ] [ j ] = 0 ; 邻接矩阵初始化,自环权值为0,无边权值为无穷大 然后B: while ( m -- ) { int x , y , v ; cin >> x >> y >> v ; dp [ x ] [ y ] = min ( dp [ x ] [ y ] , v ) ; } 把每一条边的权值更新一下,min的作用

[总结]最短路径算法

两盒软妹~` 提交于 2020-01-26 19:24:46
所谓最短路径问题是指:如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和(称为路径长度)达到最小。 下面我们介绍两种比较常用的求最短路径算法: Dijkstra(迪杰斯特拉)算法 迪杰斯特拉算法思想是按路径长度递增的次序一步一步并入来求取,是贪心算法的一个应用,用来解决单源点到其余顶点的最短路径问题。另外,要注意D算法是无法解决负权重问题的,所以图的权重必须为正。 首先,我们引入一个辅助向量 \(D\) ,它的每个分量 \(D[i]\) 表示当前找到的从起始节点 \(v\) 到终点节点 \(v_i\) 的最短路径的长度。它的初始态为:若从节点 \(v\) 到节点 \(v_i\) 有弧,则 \(D[i]\) 为弧上的权值,否则 \(D[i]\) 为 \(∞\) ,显然,长度为 \(D[j] = Min{D[i] | v_i ∈V}\) 的路径就是从 \(v\) 出发最短的一条路径,路径为 \((v, v_i)\) 。 那么,下一条长度次短的最短路径是哪一条呢?假设次短路径的终点是 \(v_k\) ,则可想而知,这条路径或者是 \((v, v_k)\) 或者是 \((v, v_j, v_k)\) 。它的长度或者是从 \(v\) 到 \(v_k\) 的弧上的权值,或者是 \(D[j]\) 与从 \(v_j\) 到 \(v_k\)

5.6最短距离+最短花费

大兔子大兔子 提交于 2020-01-24 20:56:30
只需要在求最短路径从中转节点dist等于直达的dist是再加上中转节点的price小于直达的price条件即可: if ( dist [ t ] == - 1 || dist [ t ] > dist [ newp ] + c || dist [ t ] == dist [ newp ] + c && price [ t ] > price [ newp ] + price ) { //该节点最短路径无穷或路径大于新加入节点最短路径+该边权值 dist [ t ] = dist [ newp ] + c ; price [ t ] = price [ newp ] + price ; } 来源: CSDN 作者: 缘奈酱 链接: https://blog.csdn.net/qq_44249650/article/details/104032705

200117(最短路径的Floyd算法)

你离开我真会死。 提交于 2020-01-24 01:50:39
Floyd算法是一个经典的动态规划算法。简单地说,首先我们的目标是寻找从顶点 i 到顶点 j 的最短路径。 从任意顶点i到任意顶点j的最短路径不外乎2种可能,一是直接从 i 到 j ,二是从 i 经过若干个中间顶点到 j 。所以,我们假设D(i,j)为顶点 i 到顶点 j 的最短路径的距离,对于每一个顶点 k,我们检查D(i,k) + D(k,j) < D(i,j)是否成立,如果成立,证明从 i 到 k 再到 j 的路径比 i 直接到 j 的路径短,我们便设置D(i,j) = D(i,k) + D(k,j),这样一来,当我们遍历完所有顶点 k,D(i,j)中记录的便是 i 到 j 的最短路径的距离。 算法过程: 1)首先把初始化距离数组D为图的邻接矩阵arc,路径数组P初始化为P[i][j]=j(初始化时由于 i 是直接到 j 的,所以 i 的后继结点就是 j ); 2)对于每一对顶点 i 和 j,遍历所有顶点,看看是否存在一个顶点 k 使得从 i 到 k 再加上 k 到 j 比直接从 i 到 j 的路径更短。如果是就更新D[i][j]。 递推关系式为: 如果 D[i][k]+D[k][j] < D[i][j] 则D[i][j] = D[i][k]+D[k][j] 注意!!!:仔细思考递推关系式会发现由于D[i][i]始终为0, 所以 i 、j 、k

程序员必须掌握的核心算法有哪些?

故事扮演 提交于 2020-01-23 18:21:36
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。 一、算法最最基础 1、时间复杂度 2、空间复杂度 一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必须最先学的,主要有最大复杂度、平均复杂度等,直接通过博客搜索学习即可。 文章推荐: 算法分析神器—时间复杂度 二、基础数据结构 1、线性表 列表(必学) 链表(必学) 跳跃表(知道原理,应用,最后自己实现一遍) 并查集(建议结合刷题学习) 不用说,链表、列表必须,不过重点是链表。 三分钟基础数据结构:如何轻松手写链表? 以后有面试官问你「跳跃表」,你就把这篇文章扔给他 2、栈与队列 栈(必学) 队列(必学) 优先队列、堆(必学) 多级反馈队列(原理与应用) 特别是优先队列,再刷题的时候,还是经常用到的,队列与栈,是最基本的数据结构,必学。可以通过博客来学习。相关文章: 三分钟基础知识:什么是栈?

最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)

巧了我就是萌 提交于 2020-01-21 04:46:19
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。 Dijkstra算法 能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。 其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。 初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。 例如,对下图中的有向图,应用 Dijkstra算法 计算从源顶点1到其它顶点间最短路径的过程列在下表中。 Dijkstra算法的迭代过程: 以下是具体的实现(C/C++): #include <iostream> #include<stdio.h> #include<stdlib.h> using namespace std; const int

软工_个人项目总结博客

佐手、 提交于 2020-01-21 04:19:06
项目预先规划   在个人项目开始之前,我之前的编程几乎从来没有在开始前预估过时间,所以也就是摸着石头过河,大概根据之前的经验估计了一下时间。   预估时间(单位均为小时) PSP 2.1 Personal Software Process Stages Time Planning 计划 · Estimate · 估计这个任务需要多少时间 0.1 Development 开发 · Analysis · 需求分析 (包括学习新技术) 1 · Design Spec · 生成设计文档 0.5 · Design Review · 设计复审 (和同事审核设计文档) 0.5 · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 1 · Design · 具体设计 2 · Coding · 具体编码 5 · Code Review · 代码复审 1 · Test · 测试(自我测试,修改代码,提交修改) 3 Reporting 报告 · Test Report · 测试报告 2 · Size Measurement · 计算工作量 0.2 · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 1 合计 17.3   在估计完时间后,我的内心是崩溃的

最短路(Dijkstra,Floyd,Bellman_Ford,SPFA)

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-20 21:45:05
当然,这篇文章是借鉴大佬的。。。 最短路算法大约来说就是有4种——Dijkstra,Floyd,Bellman_Ford,SPFA 接下来,就可以一一看一下。。。 1. Dijkstra (权值非负,适用于有向图及无向图,单源最短路) 1 Dijkstra's算法解决的是图中单个源点到其它顶点的最短路径。只能解决权值非负(看了代码就知道了) 2 Dijkstral只能求出任意点到达源点的最短距离(不能求出任意两点之间的最短距离),同时适用于有向图和无向图,复杂度为O(n^2). 3算法的过程: 1设置顶点集合S并不断的作贪心选择来选择扩充这个集合。一个顶点属于集合S当且仅当从源点到该点的最短路径长度已知 2 初始时,S中仅含有源。设U是G的某一个顶点,把从源到U且中间只经过S中的顶点的路称为从源到U的特殊路径,并用dis数组距离当前每一个顶点所对应的最短特殊路径 3Dijkstra算法每一次从V-S中取出具有最短特殊长度的顶点u,将u添加到S中,同时对dis数组进行修改。一旦S包含了所有的V中的顶点,dis数组就记录了从源点到其它顶点的最短路径长度。 4 模板: 没有优化,时间复杂度o(n^2) 1 #define MAXN 1010 2 #define INF 0xFFFFFFF 3 int value[MAXN][MAXN];/*保存的是边权值*/ 4 int dis[MAXN

PAT甲级真题 1003 Emergency (25分) C++实现(基于Dijkstra算法)

核能气质少年 提交于 2020-01-20 21:04:20
题目 As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams in each city and the length of each road between any pair of cities are marked on the map. When there is an emergency call to you from some other city, your job is to lead your men to the place as quickly as possible, and at the mean time, call up as many hands on the way as possible. Input Each input file contains one test case. For each test case, the first line contains 4 positive integers: N (<= 500) - the