图论模型(最短路问题)
数学建模最短路问题
设链W=v0e1v1e2…eivi已选定,则从E\{e1,e2,…,ei}中选取一条与ei相邻的边ei+1,除非已无选择余地,否则不要选G\{e1,e2,…,ei}的桥。
直到(2)不能进行为止,算法终止时得到的是Euler回路。
欧拉图与Fleury算法
01
02
如果G不是连通的Euler图,则G中含有奇度顶点(但奇度顶点的个数为偶数),此时图G的一条邮递路线必定在某些街着上重复走了一次或多次,它等价于在这些边上加一条或多条重复边,使新图G' 不含奇度顶点,并且所加边的总权为最小。
01
Dijkstra Algorithm
02
Dijkstra算法所需时间与n2成正比。
最短路问题求解算法
用Dijkstra求解最短路问题
例 求从顶点u0到其余顶点的最短路。
解:先写出距离矩阵(实际应为对称矩阵)
Dijkstra算法的迭代步骤如下
u0 u1 u2 u3 u4 u5 u6 u7
1 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞ 2 2 1 8 ∞ ∞ ∞ ∞ 3 2 8 ∞ ∞ 10 ∞ 4 8 3 ∞ 10 ∞ 5 8 6 10 12 6 7 10 12 7 9 12 8 12
第11章 最短路问题
添加副标题
1 问题的提出
STEP2
STEP1
图论是离散数学的重要分支,在物理学、化学、系统控制、电力通讯、编码理论、可靠性理论、科学管理、电子计算机等各个领域都具有极其广泛的应用。
1
图论的历史可以追溯到1736年,这一年发表了图论的第一篇论文,解决了著名的哥尼斯堡(Königsberg)七桥问题。
02
1 匹配与覆盖
基本概念
定义1设若M的边互不相邻,则称M是G的一个匹配。M的边称为匹配边,E\M的边称为自由边,若(u, v)∈M,则称u(或v)是v(或u)的配偶。若顶点v与M的一条边关联,则称v是M-饱和的;否则称为M-非饱和的。若M使G中每个顶点都是M-饱和的,称M是G的完美(理想)匹配。设M是G的一个匹配,若不存在M' 使|M'|>|M|,则称M为G的最大匹配。
《最短路问题》课件
3 最短路问题的历史
渊源
最短路问题最早由荷兰 数学家 Edsger Dijkstra 在 1956 年提出。
最短路问题的定义
图论中的最短路问 题指什么?
在无向连通图或有向连通图 中,从某一起点到其余各顶 点的最短路径。
什么是路径长度?
路径长度是指路径上边或弧 的权值之和。
什么是无环图?
无环图指不存在环的图,可 以用拓扑排序求解最短路。
《最短路问题》PPT课件
欢迎来到最短路问题的世界。在本课件中,我们将介绍四种最短路算法及其 应用,并分析它们的优缺点。
问题背景
1 什么是最短路问题? 2 为什么需要解决最
短路问题?
最短路问题是计算从源 节点到目标节点的最短 路径的问题。它是图论 中的一个经典算法问题。
很多实际问题都涉及到 最短路径的计算,比如 电网、交通、通信等领 域。
Floyd-Warshall算法解决的是所有点对之间 的最短路径问题,可以处理有向图或负边权 图。
Bellman-Ford算法
Bellman-Ford算法解决的是有向图中含有负 权边的单源最短路径问题。
A*算法
A*算法综合了贪心和广度优先搜索,在启发 函数的帮助下,可以高效解决带权图上的单 源最短路径问题。
算法示例
1
Step 1
假设我们要求从 A 点到其他各点的最
Step 2
2
短路径。
首先初始化 A 点到其他各点的距离为
无穷大,A 点到自身的距离为 0。
3
Step 3
找到 A 点的直接邻居,更新其距离值。
Step 4
4
重复 Step 3,直到所有节点的距离值 都已经更新。
总结
图论模型:最短路
T (v3 ) min{ T (v3 ), P(v0 ) f 03 } min{ ,0 1} 1
(3)比较所有的T标号,T(v3 )最小,所以令: P(v3 ) 1;
V1 5 1 5 2 V5 1 V6 3 1 V2 5 1 V4 3 T 7 4
4 1 S 4 5
2 V3
解:狄克斯特拉(Dijkstra)算法列表如下:
V1
4 1 S 4 5
2 V3
5 1 5 2 V5 1 V6 3 1 V2 5 7
4
1 V4 3
T
迭代次数 T(S) T(V1) T(V2) T(V3) T(V4) T(V5) T(V6) T(T) P标号 1 2 3 4 0 +∞ 4 3 3 +∞ +∞ 2 +∞ 1 +∞ +∞ 6 6 +∞ 4 3 3 +∞ 5 5 5 +∞ +∞ +∞ 9 S V3 V2 V1
T (v6 ) 9
(9)比较所有T标号,T(v5 )最小,所以令P(v5 ) 6;
(10)v5为刚得到P标号的点,考察边v5 v2 , v5 v6 , v5 v7的端点 v2 , v6 , v7 :
T (v2 ) min{ T (v2 ), P(v5 ) f 52 } min{ 8,6 1} 7
5
6 7 8 最短路权 父点 0 S 3 V3 2 V3 1 S
6
6 6 6 V3
3
5
5
7
7 7 7
V5
V6 V4 D
3 V3
第2讲最短路问题
u3
u4
u5
u6
u7
0
12
7 4
8
2
4 7 4
8
37
4
8
69 4
8
69
6
9
6
9
012
3
u0
u0 u0
u2
6
9
46
u3
u3
u0
u6
u1
u2
u7
u0
u4
u3
u6
u5
Dijkstra算法:求G中从顶点u0到其余顶点的最短路
设G为赋权有向图或无向图,G边上的权均均非负.
对每个顶点,定义两个标记(l(v),z(v)),其中: l(v) :表从顶点u0到v的一条路的权.
W 3 1 0 3 6 7 5 3 0 4 3
6
4
0
6
4
4 3 6 0 2
8
7
4
2
0
因G是无向图,故W是对称阵.
迭代 次数
1 2 3 4 5 6 7 8 最后标记 l (v)
z (v)
l(ui )
u0
u1
u2
3 1)
,
1
di(kk
3 1)
5
dk0(jk1)},
0 1 5 2
1
0
4 3
D(2)
5
4
0 2
2 0
1 3 3,
3 0 5
2 3 1 3 5 0
1 2 2 4 5 6
最短路模型
以引例为例,说明标号法的基本思想。
s =1,因所有wij0,故d(v1,v1)=0, 这 时v1 是具有P 标号的点。 考察从v1出发的三条弧(v1,v2), (v1,v3), (v1,v4) 。如果从v1出发沿(v1,v2)到达v2, 则需要d(v1,v1)+w12=6单位费用;如果 v1
v2
一、引例 例1:已知如图所示的单行线交通网, 每弧旁的数字表示通过这条单行线所 需的费用。现在某人要从v1出发通过 v1 这个交通网到v8 ,求使总费用最小的 旅行路线。
v2
6 3 2
1
v5
2 6 3
v9
3
v3
2
1
6 4 10
10
v4
v6
2
v7 4 v8
对于有向图G 或无向图G 的每一条边e ,附加一个实数w(e),则称 w(e)为边e 上的权,当e=(vi,vj)时,w(e)也可记为wij 。G 连同其各边 上的权称为带权图,带权图常记为G=<V,E,W>。
例2 求右图所示带权图中从v1到 v8 的最短路 解:这里只给出结果 P(v1)=0 , P(v4)=1 , P(v3)=3 , P(v2)=5 ,
6
v2
2 3 1
1
v5
2 6 3
v9
3
v1
v3
2
6 10
4
P(v5)=6 , P(v9)=8 , P(v7)=9 , P(v6)=10 ,
v4
v6
2
v7 4
6 3 2
1
v5
2 6 3
v9
3
v3
2
1
6 4 10
10
v4
最短路(图)
最短路最短路问题(short-path problem):若网络中的每条边都有一个数值(长度、成本、时间等),则找出两节点(通常是源节点和阱节点)之间总权和最小的路径就是最短路问题。
最短路问题是网络理论解决的典型问题之一,可用来解决管路铺设、线路安装、厂区布局和设备更新等实际问题。
单源最短路径包括确定起点的最短路径问题,确定终点的最短路径问题(与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。
在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。
)算法可以采用Dijkstra 算法。
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。
主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
Dijkstra 算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。
Dijkstra算法代码1#include <string.h>2#include<algorithm>3using namespace std;45const int maxnum = 100;6const int maxint = 99999999;78int dist[maxnum];9int prev[maxnum];//记录当前点的前一个结点10int c[maxnum][maxnum];11int n,line;1213void dijkstra(int n,int v,int *dist,int *prev,int c[maxnum][maxnum])//v代表源点14{15 bool s[maxnum];//判断是否已存入该点到S中16 for(int i = 1;i <= n;++i)17 {18 dist[i] = c[v][i];19 s[i] = 0;20 if(dist[i] == maxint)//代表当前点与源点没有直接相连21 prev[i] = 0;22 else23 prev[i] = v;//代表当前点的前一个节点是v,即源点24 }25 dist[v] = 0;//源点到源点的距离初始化为026 s[v] = 1;//源点已被遍历过,标记为12728 for(int i = 2;i <= n;++i)29 {30 int tmp = maxint;31 int u = v;32 for(int j = 1;j <= n;++j)33 {34 if((!s[j]) && dist[j] <tmp)//该点没有被遍历到并且源点到j点的距离小于记录的距离35 {36u = j;//记录下这一点37tmp = dist[j];//记录下这一点到源点的距离38 }39 }40 //找到距离最短的点退出循环41 s[u] = 1;//标记该点已经遍历过4243 for(int j = 1;j <= n;++j)44 {45 if((!s[j]) && c[u][j] <maxint)//j没有被遍历过并且从u到j还有这条路径46 {47 int newdist = dist[u] + c[u][j];//新的距离是从源点到u的距离加上从u到的距离48 if(newdist <dist[j])//如果新的距离比原来到j的距离要短49 {50 dist[j] = newdist;//则更新dist数组51 prev[j] = u;//标记j的前一个节点是u52 }53 }54 }55 }56}5758void searchpath(int *prev,int v,int u)//查找从v到u的最短路径59{60 int que[maxnum];//保存路径61 int tot = 1;62 que[tot] = u;//把终点存入路径数组63 tot++;64 int tmp = prev[u];65 while(tmp != v)66 {67 que[tot] = tmp;68 tot++;69tmp = prev[tmp];70 }71 que[tot] = v;72 for(int i = tot;i >= 1;--i)73 {74 if(i != 1)75 printf("%d->",que[i]);76 else77 printf("%d\n",que[i]);78 }79}808182int main()83{84 scanf("%d",&n);//输入结点数85 scanf("%d",&line);//输入路径数目86 int p,q,len;87 for(int i = 1;i <= n;++i)//初始化存储数组88 {89 for(int j = 1;j <= n;++j)90 {91 c[i][j] = maxint;92 }93 }94 for(int i = 1;i <= line;++i)//往存储数组里存放路径95 {96 scanf("%d%d%d",&p,&q,&len);97 if(len <c[p][q])//如果两个点之间有多条路,取路径较短的那一条98 c[p][q] = len;99 c[q][p] = len;//该语句根据实际情况写,用于无向路径中100 }101 for(int i = 1;i <= n;++i)//初始化标记数组102 dist[i] = maxint;//该数组记录从起点到该点的最短路径长度103104105 dijkstra(n,1,dist,prev,c);106 printf("从源点到最后一个顶点的最短路径长度为:%d\n",dist[n]);107 printf("从源点到最后一个顶点的路径为:");108 searchpath(prev,1,n);109}全局最短路求图中所有的最短路径。
最短路问题的三种算法模板
最短路问题的三种算法模板最短路算法&模板最短路问题是图论的基础问题。
本篇随笔就图论中最短路问题进⾏剖析,讲解常⽤的三种最短路算法:Floyd算法、Dijkstra算法及SPFA算法,并给出三种算法的模板。
流畅阅读本篇博客需要有图论的基础知识,了解什么是图,什么是最短路,以及⼀些基本语法知识和算法基础。
1、Floyd算法我个⼈认为,Floyd算法是三种最短路算法中最简单、最好理解的算法。
它的适⽤范围是任意两点之间的最短路。
这⼀点是其他两种算法(单源最短路)⽆法⽐拟的。
它的实现思路也很简单:⽤三重循环,枚举断点、起始点和终点(注意:顺序千万不能反!!),如果起始点到断点,断点到终点的距离和⼩于起始点到终点当前状态下的最短路(也就是说找到了⼀个⽐它还短的),那么就更新最短路。
它的优点就是简洁明了,易于理解,但是缺点也显⽽易见,通过它的实现途径,我们可以发现,使⽤Floyd算法的题⼀定要⽤邻接矩阵存图,这样的⼀个⼆维数组显然对空间有着要求,⼀般来讲,只能⽀持不超过500个点的图,假如更多,便⽆法⽀持。
同时,Floyd算法还对时间有着要求,因为是三重循环,所以它的时间复杂度是O(n3)的,这样的复杂度如果出现在⼀个复杂程序中,极其容易TLE,所以,请⼤家使⽤的时候,⼀定要读题读题,慎重慎重!模板:void Floyd(){memset(map,0x3f,sizeof(map));for(int i=1;i<=n;i++)map[i][i]=0;for(int k=1;k<=n;k++)//顺序不要反for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)map[i][j]=min(map[i][k]+map[k][j],map[i][j]);}2、Dijkstra算法Dijkstra算法,中⽂名是迪杰斯特拉算法,简写是DIJ算法。
DIJ算法是求解单源最短路,即从某⼀个源点到达其他所有点的最短路的⼀个经典算法。
图论模型(最优连线问题、最短路问题)
v3
8.1 最优连线问题(最小生成树)
例1 现需从自来水厂接自来水管道到各个城镇,自 来水厂到各城镇之间铺设自来水管道价格如下,问 如何铺设最经济。
A 8 B
5
E 1
7 6
水厂
3 10
D 9
C
分析: ①显然铺设的自来水管道要连通各个顶点; ②铺设的管道中如果有回路,则去掉一条边,仍可 行。 故所铺设的管道是连通各个顶点且没有回路的 图形,称为图G的生成树。 我们的目标是寻找一颗图G的生成树,其各条 边的权之和最小,称为最小生成树。 1956年,Kruskal给出了一种求最小生成树的 算法,称为避圈法。
e2 e5
e4
M
v2
v3
v4
v4
0 0 0 1
1 0 1 0
0 0 0 1
0 1 0 0
e3
v3
例3
v1 2 v2
v1 v1 v2 v3 v4
3 7
8
M
v2
v3
v4
v4
0 7
2 0 8
0 5
3 0
5
lv; v; s(k+1)=v; k=k+1; u=s(k); end l z 输出结果为: l=0 2 1 7 3 6 9 12 z=1 1 1 6 2 5 4 5
注:l输出的是u1到u1、u2、…、u8各个顶点的 最短路径距离。 z输出的是最短路径中u1、u2、…、u8的父节点。
%求从u0到uj0的最短路径 disp('起点为u1.'); j=input('输入终点u'); disp('下面求从起点u1到终点'); j, disp('的最短路径。'); lj=[]; while j~=1 lj=[[j],lj]; j=z(j); end lj=[[1],lj]; lj 例如求u1到u8的最短路径,程序执行后输出为:1 2 5 6 8 各位有兴趣还可以考虑将图可视化,点击屏幕输入终点以及 在图形上输出显示最短路径。
最短路算法 题
最短路算法题最短路算法是用于解决图论中一类重要问题的算法,即寻找图中从一个顶点到另一个顶点的最短路径。
这里的最短路径可以是路径的长度(边的数量)或路径的权重之和(边的权重)。
以下是一些常见的最短路算法题目类型及其解法:1.单源最短路问题:给定一个图和一个起点,找到从起点到图中所有其他点的最短路径。
2.Dijkstra算法:适用于带权重的图,且权重非负。
该算法每次迭代都会选取当前距离起点最近的一个顶点,并更新该顶点与起点的最短距离。
所有顶点都被访问后,算法结束。
3.Bellman-Ford算法:适用于带权重的图,权重可以为负。
该算法通过对图中的所有边进行迭代松弛操作来找到最短路径。
此外,它还可以检测并处理负权重环。
4.Floyd-Warshall算法:适用于所有顶点对之间的最短路径问题。
它使用动态规划的思想,逐步构建中间点集合,并利用中间点来更新最短路径。
5.多源最短路问题:给定一个图和多个起点,找到从这些起点到图中所有其他点的最短路径。
一种常见的解决方法是对每个起点分别运行单源最短路算法。
但这种方法可能不够高效,特别是当起点数量较大时。
另一种方法是使用更高级的数据结构或算法,如优先队列优化的Dijkstra算法或基于矩阵乘法的Floyd-Warshall算法变种。
5.特定条件下的最短路问题:除了基本的最短路问题外,还有一些特定条件下的最短路问题,如有向无环图(DAG)中的最短路径、边权重受限制的最短路径等。
这些问题通常需要结合特定的图论知识和技巧来解决。
6.在解决最短路问题时,需要注意以下几点:确保理解问题的具体要求,如路径的长度是按边的数量还是按边的权重计算。
根据问题的特点选择合适的算法和数据结构。
例如,对于稠密图,邻接矩阵可能是更好的选择;而对于稀疏图,邻接表可能更合适。
注意处理特殊情况,如负权重环、不连通图等。
这些情况可能导致最短路径不存在或无穷大。
在实现算法时,注意优化性能和减少不必要的计算。
5.最短路问题
( 初值,即 D (0) = (dij0) )ν ×ν = ( wij )ν ×ν = W .
2)对 k = 1,2,…,ν ,计算
( ( ( ( ( D ( k ) = ( dijk ) )ν ×ν , 其中 dijk ) = min{dijk −1) , dikk −1) + d kjk −1) }, (k dij ) 表示从 vi 到 v j 且中间点仅为 v1, v2 ,…, vk 的 k 个点的所有
d(i,j):i 到 j 的距离. : 的距离. r(i,j):i 到 j 之间的插入点. : 之间的插入点. 输入: 输入 带权邻接矩阵W = ( w(i, j ))v×v .
(1) 赋初值: 赋初值: 对所有 i,j, d(i,j) ← w(i,j), r(i,j) ← j, k ← 1.
(2) 更新 d(i,j), r(i,j): 对所有 i,j,若 d(i,k)+d(k,j)<d(i,j), , , 则 d(i,j) ← d(i,k)+d(k,j), r(i,j) ← k
∞ 2 ∞ 4 ∞ 1 , 3 3 0 5 5 0 ( k −1) + d kj },
D (1)
1 2 3 0 1 ∞ ∞ ∞ 2 1 2 3 1 0 4 ∞ ∞ 3 1 2 3 ∞ 4 0 2 ∞ 1 (1) = , R = ∞ ∞ 2 0 3 3 1 2 3 ∞ ∞ ∞ 3 0 5 1 2 3 2 3 1 3 5 0 1 1 3
最短路问题及算法
最短路问题是图论应用的基本问题, 最短路问题是图论应用的基本问题,很多实际 问题,如线路的布设、运输安排、 问题,如线路的布设、运输安排、运输网络最小费 用流等问题,都可通过建立最短路问题模型来求解 用流等问题 都可通过建立最短路问题模型来求解. 都可通过建立最短路问题模型来求解 •最短路的定义 最短路的定义 •最短路问题的两种方法:Dijkstra和Floyd算法 . 最短路问题的两种方法: 最短路问题的两种方法 和 算法 1) 求赋权图中从给定点到其余顶点的最短路. 求赋权图中从给定点到其余顶点的最短路. 2) 求赋权图中任意两点间的最短路 求赋权图中任意两点间的最短路.
图与网络分析-最短路
② 给 v2 标号(4)。
③ 划第二个弧。
v2 (4)
4
5
4
v4
7
9
5
v6
1
v1 (0)
①
②
5
v8
1
6
4
v3
7
v5
6
v7
表明走出 v1 后走向 v8 的最短路目前看是 (v1 , v2 ) ,最优距离 是4 。 现已考察完毕第二个圈内的路,或者说,已完成 v1 , v2 的标号。
v1 v3 v6
59 40 28 30
21
v1 (0)
①
12
19 13
v2 (12)
② ③
v3 (19)14 20
v4 (28) 15
29
④
15 v5 (40)
22
v6
41
⑤
最短路路长为49。 即:在第一年、第三年初各购买一台新设备为最优决策。 这时5年的总费用为49。
例3 (选址问题 ) 已知某地区的交通网络如图所示, 其中点代表居民小区,边代表公路,边权为小区间公路距离, 问区中心医院应建在哪个小区,可使离医院最远的小区居民就 诊时所走的路程最近? 解 求中心的问题。 解决方法:先求出 vi 到 其它各点的最短路长 d j
min{ 24 , k34 , k56 , k57 } min{ ,10,13,14} 9 k 9
① 给 (v2 , v4 ) 划成粗线。 ② 给 v4 标号(9)。 ③ 划第5个弧。
v2 (4)
4
5
4
v4(9)
7
9
5
v6 (13)
1
v1 (0)
图_最短路_2
图论——单源最短路一、最短路两点之间的最短路:给定一个带权图,图中两点i与j的最短路是指从i到j的一条路径,这条路径经过的边的权值之和最小。
求单源最短路:给定一个带权图,求图以结点start为起点的单源最短路是指对每一个结点j<>start,求出start到j的最短路。
二、图的存储方式对于求最短路类问题的算法,图的不同存储方式会产生很大的影响,总的来说,图的存储方式有邻接矩阵,邻接表,前向星等几种。
邻接矩阵:这种存储方法需要开设一个V^2的二维数组edge,对于每两个顶点i和j,如果ij有边,则edge[i,j]=w[i,j],否则edge[i,j]=-1,这里w[i,j]为边Eij的权。
邻接表:邻接表有链表与数组两种实现方式,如果用数组实现,同邻接矩阵一样需要一个V^2的二维数组edge,edge的每个元素包含两个信息:终点和权值。
另有一个数组a记录从指定顶点出发的边数。
对于每个顶点i,edge[i, j](j=1~a[i])表示从i出发的第j条边的终点与权值。
若用链表实现邻接表,我们可以将edge减成一维,在每个edge[i]后面连一条链表,链表上的每个结点都表示由i出发的一条边。
前向星:前向星的存法只需两个一维数组pos与edge,其中edge[i]存储了第i条边的信息,这些边是按照起点由小到大排好序的,而pos[i]则表示以i为起点的第一条边的位置。
这样在edge[pos[i]~pos[i+1]-1]中便可找到从i出发的所有边的信息。
以下的例子显示了这四种存储图的方法:2 4邻接矩阵:邻接表(数组):邻接表(链表):edge各种存储方法的比较:#对于稀疏图而言,复杂度约为常数。
*需要一个O(ElogE)的预处理(排序)。
总的来说,邻接矩阵比较好编写,存储方式简单明了,适合中小规模数据;用数组实现的邻接表与邻接矩阵相差不多;用链表实现的邻接表编程复杂度较高,但效率很好,适合各种各样的图论类题目;前向星只对数组进行操作,编写不是很难,同时效率也不错,在不需要修改边的最短路问题中,前向星是遇到大数据时的最佳选择。
浅谈图论(一)——最短路问题
浅谈图论(⼀)——最短路问题图论〔Graph Theory〕是数学的⼀个分⽀。
它以图为研究对象。
图论中的图是由若⼲给定的点及连接两点的线所构成的图形,这种图形通常⽤来描述某些事物之间的某种特定关系,⽤点代表事物,⽤连接两点的线表⽰相应两个事物间具有这种关系。
(摘⾃百度百科)1.Floyd 弗洛伊德算法这种算法解决的是多源最短路问题(求任意两点之间的最短路径)若我们⽤⼆维数组e[i][j]表⽰点i到点j当前的最短距离(程序运⾏完后数组中存的就是真正的最短距离)那么我们可以⽤e[i][j]=max(e[i][j],e[i][k],e[j][k]);来更新e数组。
也就是⽐较从i到j 和从i到k+从k到j 的距离重点来啦核⼼思想:能否找到第三点使得任意两点的距离变短,即能否找到 i->k->j ⽐ i->j 短,如果能找到,就更新。
下⾯呈上代码://多元最短路 Floyd O(n^3)#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int maxn=99999999;int n,m,e[1005][1005];int main(){int i,j,k,a,b,c;scanf("%d%d",&n,&m);for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(i==j) e[i][j];else e[i][j]=maxn;}}for(i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);e[a][b]=c;}//Floyd核⼼部分for(i=1;i<=n;i++)for(j=1;j<=n;j++)for(k=1;k<=n;k++)if(e[j][k]>e[j][i]+e[i][k])e[j][k]=e[j][i]+e[i][k];for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%d ",e[i][j]);printf("\n");}return0;}Floyd很容易发现Floyd算法的时间复杂度是O(N^3)。
数学建模_ 图论模型_
图论中最短路算法与程序实现图论中的最短路问题(包括无向图和有向图)是一个基本且常见的问题。
主要的算法有Dijkstra 算法和Floyd 算法。
Dijkstra 算法是求出指定两点之间的最短路,算法复杂度为 Floyd 算法是求出任意两点之间的最短路,算法复杂度为 2()O n 3()O n1.Dijkstra算法2. Floyd算法算法程序(Matlab)为:for k=1:nfor i=1 :nfor j=1:nt=B(i,k)+B(k,j);if t<B(i,j) B(i,j)=t; end endendend起点终点距离起点终点距离起点终点距离12400718160151725013450892001617140243008152851618130221230910180172724024714010111501819204346001015160182518045210111214019201404193101114130192417556230121320020211805720013344002024190673201415190212230068340142619021232707817015161702147350表1 各点距离(m)实例:已知50个点之间相互连接信息见表1及续表。
求最短距离矩阵续表1 各点距离(m)起点终点距离起点终点距离起点终点距离22441602229313640190 22452702230313738135 22481802230423839130 23242402330433941310 23292102331324041140 23302902331364050190 23441502331504250200 24251702432334344260 24281302432354345210 26271402632364546240 26343202633344648280 27281902735374849200 2829260283639n=50; %Matlab实现的Floyd算法A=zeros(n,n);for i=1:nfor j=1:nif(i==j) A(i,j)=0;else A(i,j)=100000;endendend %赋直接距离信息A(1,2)=400;A(1,3)=450; A(2,4)=300;A(2,21)=230; A(2,47)=140;A(3,4)=600;A(4,5)=210;A(4,19)=310;A(5,6)=230;A(5,7)=200; A(6,7)=320; A(6,8)=340;A(7,8)=170;A(7,18)=160;A(8,9)=200;A(8,15)=285; A(9,10)=180; A(10,11)=150; A(10,15)=160; A(11,12)=140; A(11,14)=130; A(12,13)=200; A(13,34)=400;A(14,15)=190;A(14,26)=190; A(15,16)=170; A(15,17)=250; A(16,17)=140;A(16,18)=130; A(17,27)=240; A(18,19)=204; A(18,25)=180; A(19,20)=140; A(19,24)=175; A(20,21)=180; A(20,24)=190; A(21,22)=300; A(21,23)=270; A(21,47)=350;A(22,44)=160;A(22,45)=270;A(22,48)=180;A(23,24)=240; A(23,29)=210;A(23,30)=290;A(23,44)=150;A(24,25)=170;A(24,28)=130; A(26,27)=140;A(26,34)=320;A(27,28)=190;A(28,29)=260;A(29,31)=190; A(30,31)=240;A(30,42)=130;A(30,43)=210;A(31,32)=230;A(31,36)=260; A(31,50)=210;A(32,33)=190;A(32,35)=140;A(32,36)=240;A(33,34)=210; A(35,37)=160;A(36,39)=180;A(36,40)=190;A(37,38)=135;A(38,39)=130; A(39,41)=310;A(40,41)=140;A(40,50)=190;A(42,50)=200;A(43,44)=260; A(43,45)=210;A(45,46)=240;A(46,48)=280;A(48,49)=200;for j=1:nfor i=1:j-1A(j,i)=A(i,j); %使矩阵对称endendB=A;%利用Floyd算法计算最短距离矩阵for k=1:nfor i=1 :nfor j=1:nt=B(i,k)+B(k,j);if t<B(i,j) B(i,j)=t; endendendend %输出距离矩阵到文件fid=fopen('distance.txt','w'); for i=1:nfor j=1:nfprintf(fid,'%4d ',B(i,j)); endfprintf(fid,'\n');endfclose(fid);。
第1讲_最短路问题
(1) 若 V1 V, E1 E,且当 e E1 时, 特 1 (e)= (e),则称 G1 是 G 的子图. 别的,若 V1=V,则 G1 称为 G 的生成子图.
(2)
设 V1 V,且 V1 ,以 V1 为顶点集、两个端点都在 V1 中的图 G 的边为边集的图 G 的子图,称为 G 的由 V1 导出的子图,记为 G[V1].
1 mij 1 0
若vi 是e j的起点 若vi 是e j的终点 若vi 与e j 不关联
邻接矩阵
对无向图G,其邻接矩阵 A (aij )nn ,其中:
1 aij 0
若vi 与v j 相邻 若vi 与v j 不相邻
注:假设图为简单图
v4 v1 v2 v 3 v 4
若vi 与e j 相关联 若vi 与e j 不关联
e1 1 M= 1 0 0
注:假设图为简单图
e2 e3 e4 e5 0 0 0 1 v1 1 0 1 0 v2 0 1 1 0 v3 1 1 0 1 v4
对有向图G,其关联矩阵M= (mij )nm ,其中:
公路连接问题 某一地区有若干个主要城市,现准备修建高速公路把这些城市连接起来,使得从 其中任何一个城市都可以经高速公路直接或间接到达另一个城市。假定已经知道了任 意两个城市之间修建高速公路的成本,那么应如何决定在哪些城市间修建高速公路, 使得总成本最小? 指派问题(assignment problem) 一家公司经理准备安排名员工去完成项任务,每人一项。由于各员工的特点不同, 不同的员工去完成同一项任务时所获得的回报是不同的。如何分配工作方案可以使总 回报最大? 中国邮递员问题(CPP-chinese postman problem) 一名邮递员负责投递某个街区的邮件。如何为他(她)设计一条最短的投递路线 (从邮局出发,经过投递区内每条街道至少一次,最后返回邮局)?由于这一问题是 我国管梅谷教授1960年首先提出的,所以国际上称之为中国邮递员问题。
图论
(3) P(v2 ) 3
(4)
T (v3 ) min[ T (v3 ) , P(v2 ) l23 ] min[5 , 3 1] 4 T (v4 ) min[ T (v4 ) , P(v2 ) l24 ] min[ , 3 2] 5 T (v5 ) min[ T (v5 ) , P(v2 ) l25 ] min[ , 3 2] 5
v5
5 6 8.5 2.5 2 v9
v2 3 0 2 v1
3 v6 5 v3 3 1
7
4 v7 3 2 v8 9 4
4
v4
二、最大流问题
(一) 基本概念 1、设一个赋权有向图G=(V, E), V:发点vs、收点vt 、中间点 G:弧(vi , vj)∈E , 有非负数cij,弧的容量 G——容量网络,简称网络,记做: G (V , E, C ) 网络G上的流,是指定义在弧集合E上的一个函数
v2
13 (5)
5 (3) 6(3) 5 (2)
v5
4 (2) 4 (1)
9 (5)
v1
9 (3)
4 (1) 5 (2)
v4
5 (0)
v7
10 (1)
v3
v6
截集1
13 (11)
v2
4 (0)
5 (5) 6(6) 5 (4)
v5
4 (4)
9 (9)
v1
9 (9)
5 (5)
v4
4 (3)
5 (4)
v7
L( )
最小。
( vi , v j )
l
ij
(一) 狄克斯屈拉(Dijkstra)算法 适用于wij≥0,给出了从vs到任意一个点vj的最短路。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数学模型与实验
v2
1
v5
2 v9
6
v1 0 3
2
v3 3 6 4 10 6
3 v8
2
3
4
v4
1
10
v6
2
v7
由 min{d(v1,v1)+w12, d(v1,v1)+w13 , d(v1,v4)+w46}= min{6,3,11} = d(v1,v1)+w13=3 知,d(v1,v3)=3, λ(v3)=1.
Jin Peng
http: //peng/jpeng.html
数学模型与实验
Dijkstra 算法(wij ≥0)
v2 1 v5 2 6 v1 3 2 v3 2 v9
6
4
10
3
6
3 v8
0
1 v4
1
10
v6
2
v7
4
易知 d(v1,v1)=0,λ(v1)=0. 由 min{d(v1,v1)+w12, d(v1,v1)+w13 , d(v1,v1)+w14}= min{6,3,1} = d(v1,v1)+w14=1 知,d(v1,v4)=1,λ(v4)=1.
d (vs , v j ) min {d (vs , vi ) wij }
i
利用以下递推公式可求出 vs 到其它各点的距离。
d (1) (vs , v j ) wsj , ( j 1,2, p) 对 t 2,3, d (t ) (vs , v j ) min {d t 1 (vs , vi ) wij }, ( j 1,2, p)
Jin Peng http: //peng/jpeng.html
数学模型与实验 v2 5 v5 6
2
v9 v1 0
v3 3
4
10 3
6
3 v8
v4
1
10
v6
2
v7
9
4
由 min{d(v1,v4)+w46, d(v1,v5)+w56 , d(v1,v5)+w57 , d(v1,v5)+w58}= min{11,10,9,12} = d(v1,v5)+w57=9 知,
d(v1,v7)=9, λ(v7)=5.
Jin Peng http: //peng/jpeng.html
数学模型与实验 v2 5 v5 6
2
v9 v1 0 v8 v4
v3 3
4
10
6
3
1
10
v6
2
v7
9
4
10
由 min{d(v1,v4)+w46, d(v1,v5)+w56, d(v1,v5)+w58 , d(v1,v7)+w78 }= min{11,10,12,13} =
d(v1,v5)+w56=10 知,d(v1,v6)=10, λ(v5)=5.
Jin Peng http: //peng/jpeng.html
数学模型与实验
v2
5
v5
6
2 v9
v1 0
v3 3
6
3 v8
v4
1
10
v6
10
v7 9
4
12
d(v1,v5)+w58=12 知,d(v1,v8)=10,λ(v8)=5. d(v1,v9)=+∞, λ(v9)=M.
Jin Peng http: //peng/jpeng.html
数学模型与实验
v2
5
1
v5
2 v9
6
v1 0
2
v3 3 6 4 10 6
3 v8
3
4
v4
1
10
v6
2
v7
由 min{d(v1,v1)+w12, d(v1,v4)+w46, d(v1,v3)+w32 }= min{6,11,5} = d(v1,v3)+w32=5 知,d(v1,v2)=5, λ(v2)=3.
数学模型与实验
最短路问题
求 v1 到 其它各点 的最短路
v2 1 v5 2 6 v1 1 3 2 v3 6 4 10 6 v9 3 v8 10
2
3 4
v4
Jin Peng
v6
2
v7
http: //peng/jpeng.html
数学模型与实验
基本概念
给定图 D=(V,A), 对 D 中的每一条弧 aij = (vi,vj),相应地有一个数 wij,则称这样的图为赋 权有向图,称 wij 为弧 (vi,vj) 上的权. 又给定 D 中的两个顶点 vs,vt,设 P 是 D 中从vs 到 vt 的一条路,称路 P 中所有弧的权之和为路 P 的 权,记为 w(P). 如果从 vs 到 vt 的路 P* 的权是图 D 中所有从vs 到 vt 的路的权中最小者,则称 P* 是从 vs 到 vt 的最 短路.即
由 min{d(v1,v5)+w58, d(v1,v7)+w78 }= min{12,13} =
根据λ的取值可求出 v1 到其它各点的最短路。
Jin Peng http: //peng/jpeng.html
最短路算法(wij 存在小于0 的情况) 如果 P 是 D 中从 vs 到 vj 的最短路,vi 是 P 中的一个 点,那么,从vs 沿 P 到 vj 的路是从 vs 到 vi 的最短路,则有
w( P ) min w( P)
* P
Jin Peng http: //peng 到 vt 的距离,记为 d(vs ,vt ).
最短路算法
性质:如果 P 是 D 中从 vs 到 vj 的最短路,vi 是 P 中的一个点,那么,从vs 沿 P 到 vi 的路是从 vs 到 vi 的最短路.
Jin Peng http: //peng/jpeng.html
数学模型与实验
v2
5
1
v5
6
2 v9
v1 0
v3 3
6
4
10
6
3 v8
3
4
v4
1
10
v6
2
v7
由 min{d(v1,v4)+w46, d(v1,v2)+w25}= min{11,6}
= d(v1,v2)+w25=6 知,d(v1,v5)=6,λ(v5)=2.
i
若到某一步,例如第k步,对所有j=1,2,…9,有
d ( k ) (vs , v j ) d ( k 1) (vs , v j )
则vs 到各点的距离。