我们用DP来求解任意两点间的最短路问题 首先定义状态:d[k][i][k]表示使用顶点1~k,i,j的情况下,i到j的最短路径 (d[0][i][j]表示只使用i和j,因此d[0][i][j] = cost[i][j]) 状态转移方程:d[k][i][j] = min ( d[k-1][i][k], d[k-1][k][j] ) 解释:我们分i到j的最短路正好经过顶点k一次和完全不经过k两种情况来讨论. 这个DP也可以使用滚动数组来进行递推:d[i][j] = min ( d[i][j], d[…
开始图论学习的第二部分:最短路径. 由于知识储备还不充足,暂时不使用邻接表的方法来计算. 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshall算法: 思路如下:把所有从顶点i到j可能经过的顶点一一枚举,不断更新从i到j的最小权值:d[i][j] = min{d[i][j],d[i][k]+d[k][j]},是一种动规的思想 局限性:不能处理有负权回路(负圈)的情况,而且一般是使用邻接矩阵的方式来实现. 优劣性:思路简单,核心代码简洁易懂…
1.弗洛伊德算法(Floyd) 弗洛伊算法核心就是三重循环,M [ j ] [ k ] 表示从 j 到 k 的路径,而 i 表示当前 j 到 k 可以借助的点:红色部分表示,如果 j 到 i ,i 到 k 是通的,就将 j 到 k 的值更新为 M[j][i] + M[i][k] 和 M[j][k] 较短的一个. <<; ; i <= n; i++) { ; j <= n; j++) { ; k <= n; k++) { if (j!=k) { M[j][k] = min(M[…
最短路算法(一) 最短路算法有三种形态:Floyd算法,Shortset Path Fast Algorithm(SPFA)算法,Dijkstra算法. 我个人打算分三次把这三个算法介绍完. (毕竟写太长了又没有人看QAQ……)但是这篇博客好像又双叒叕写的有点长,真的请各位耐心看完QAQ 今天先来介绍最简单的Floyd算法. Part 1:最短路问题是什么? 我们用专业一点的术语表达,大概是这样子的: 若网络中的每条边都有一个数值(长度.成本.时间等),则找出两节点(通常是源节点和阱节点)之间总…
1.引言 图的连通性问题是图论研究的重要问题之一,在实际中有着广泛的应用.例如在通信网络的联通问题中,运输路线的规划问题等等都涉及图的连通性.因此传递闭包的计算需要一个高效率的算法,一个著名的算法就是warshall在1962年提出的WarShall算法. 2.算法描述 使用n阶布尔矩阵\(R^{(k)}(0\leq k\leq n)\)来表示有向图中任意一对节点 是否含有路径的信息.因此,可将原问题划分为如下决策阶段: \[R^{(0)},R^{(1)},\cdots,R^{(k)},\cdo…
题目链接:http://codeforces.com/gym/101873/problem/D 题意: 给出 $n$ 个事实,表述为 "XXX are worse than YYY".再给出 $m$ 个某人说的话,也是表述为 "XXX are worse than YYY",对于每句话都要判断是否正确: 如果正确,输出 "Fact":如果错误,输出 "Alternative Fact":如果无法判断,输出 "Pant…
一.主要内容: 介绍图论中两大经典问题:最小生成树问题以及最短路径问题,以及给出解决每个问题的两种不同算法. 其中最小生成树问题可参考以下题目: 题目1012:畅通工程 http://ac.jobdu.com/problem.php?pid=1012 题目1017:还是畅通工程 http://ac.jobdu.com/problem.php?pid=1017 题目1024:畅通工程 http://ac.jobdu.com/problem.php?pid=1024 题目1028:继续畅通工程 ht…
暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表示这条公路的长短.请注意这些公路是单向的.我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径.这个问题这也被称为“多源最短路径”问题. 现在需要一个数据结构来存储图的信息,我们仍然可以用一个4*4的矩阵(二维数组e)来存储.比如1号城市到2号城市的路程为2,则设e[1][2]…
看完这篇文章写的小程序,Floyd最短路径算法,求从一个点到另一个点的最短距离,中间可以经过其他任意个点.三个for循环,从i到j依次经过k的最短距离,最外层for循环是经过点K,内部两个循环是从i(0)到j(0,1,2,3)经过k(0)的最短距离,从i(1)到j(0,1,2,3)经过k(0)的最短距离,······,从i(3)到j(0,1,2,3)经过k(0)的最短距离:在经过k(0)的基础上再经过k(2),从i(0)到j(0,1,2,3)经过k(1)的最短距离,从i(1)到j(0,1,2,3…
1.Dijkstra算法 求一个顶点到其它所有顶点的最短路径,是一种按路径长度递增的次序产生最短路径的算法. 算法思想: 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的集合(初始时只含有源点V0) (2)V-S=T:尚未确定的顶点集合 将T中顶点按递增的次序加入到S中,保证: (1)从源点V0到S中其他各顶点的长度都不大于从V0到T中任何顶点的最短路径长度 (2)每个顶点对应一个距离值 S中顶点:从V0到此顶点的长度 T中顶点:从V0到此顶点的只包括S中顶点作中间…