多段图算法

简介: COST(i,j)=min{c(j,v) + COST(i+1,v)}   (v∈Vk+1,∈E) COST(3,6) = min{6+COST(4,9), 5+COST(4,10)} = 7 (已知COST(4,9)=4,COST(4,10)=2)COST(3,7) = min{4+COST...

COST(i,j)=min{c(j,v) + COST(i+1,v)}
  (v∈Vk+1,<j,v>∈E)

COST(3,6) = min{6+COST(4,9), 5+COST(4,10)} = 7 (已知COST(4,9)=4,COST(4,10)=2)
COST(3,7) = min{4+COST(4,9), 3+COST(4,10)}= 5
COST(3,8) = 7
COST(2,2) = min{4+COST(3,6), 2+COST(3,7), 1+COST(3,8)}= 7
COST(2,3) = 9
COST(2,4) = 18
COST(2,5) = 15
COST(1,1) = min{9+COST(2,2), 7+COST(2,3),3+COST(2,4), 2+COST(2,5)}= 16
于是,由s到t的最小成本路径的成本为16。

 

多段图的向前处理算法:
line void FGraph (edgeType E, int k, int n, int P[]) {
//输人按段顺序给结点编号的有n个结点的k段图。E是边集,
//c(i,j)是边<i,j>的成本。P(1:k)是最小成本路径。

1 float COST[n];int D[n-1], r, j;
2 COST[n]=03 for(j=n-1;j>=1;--j) { //计算COST(j)
4 设r是一个这样的结点,<i,j>∈E且使c(j,r)+COST[r]取最小值;
5 COST[j] = c[j,r] + COST[r];
6 D[j]=r;
7 };//找一条最小成本路径
8 P[1]=1;p[k]=n;
9 for(j=2;j<=k-1;++j){ //找路径上的第j个结点
10 P[j] = D[P[j-l]];
11 };//for
12 }//FGraph

  如果G用邻接表表示,那么第4行的r可以在与结点j的度成正比的时间内算出。因此,如果G有e条边,则第3~7行的for循环的时间是Θ(n+e),第9~11行的for循环时间是Θ(k)。总的计算时间在Θ(n+e)以内。除了输人所需要的空间外,还需要给COST,D和P分配空间。

 

BCOST(i,j)=min{BCOST(i-1,v)+c(v,j)}

  (v∈Vi-1,<v , j>∈E)

BCOST(3,6) = min{BCOST(2,2)+4,BCOST(2,3)+2}= 9
BCOST(3,7) = 11
BCOST(3,8) = 10
BCOST(4,9) = min{BCOST(3,6)+6,BCOST(3,7)+4}= 15
BCOST(4,10) = min{COST(3,6)+5,BCOST(3,7)+3,BCOST(3,8)+5}=14
BCOST(4,11) = 16
BCOST(5,12) = min{BCOST(4,9)+4,BCOST(4,10)+2,BCOST(4,11)+5}=16

 获取s到t的一条最小成本路径的向后处理算法是函数BGraph。它与FGraph一样,略去了BCOST,P和D的第一个下标。只要G用它的逆邻接表表示,即对于每一个结点v,有一个使得<w,v>∈E的结点w的链接表。

 

多段图的向后处理算法:

Line void BGRAPH(edgeType E, int k, int n, int BP[]) {
//和FGraph功能相同
float BCOST[n];int D[n-1],r,j;

1 BCOST[1] = 02 For(j=2;j<=n;++j) { 计算BCOST(j)
3 设r是一个这样的结点,<i,j>∈E且使BCOST[r]+c[r,j]取最小值;
4 BCOST[j] = BCOST[r] + c[r,j];
5 D[j] = r;
6 };//for
//找一条最小成本路径
7 BP[1] = 1;BP[k] = n;
8 for(j=k-1;j>=2;--j) {//找路径上的第j个结点
9 BP[j]=D[BP[j+1]]
10 };//for
11 }//BGraph

不难看出,即使对多段图的更一般形式,即图中允许有这样的边<u,v>,其中u∈Vi,v∈Vj且i<j,FGraph和BGraph都能正确地运行。

 

 

 

 

相关文章
|
6月前
|
算法
飞行员配对方案(Dinic求最大二分图匹配(对匈牙利算法的优化),以及二分图的建图方式)
飞行员配对方案(Dinic求最大二分图匹配(对匈牙利算法的优化),以及二分图的建图方式)
96 0
|
1月前
论多段图的最短路径问题(我认为本质上还是暴力枚举法)
本文讨论了多段图最短路径问题的解决方法,认为本质上是使用暴力枚举法,通过逐步计算每个阶段点的最短距离来确定从起点到终点的最短路径。
35 1
论多段图的最短路径问题(我认为本质上还是暴力枚举法)
|
5月前
|
计算机视觉
图像处理之给定任意四点不规则放缩
图像处理之给定任意四点不规则放缩
29 3
|
5月前
|
Python
求解带有限重的三维装箱问题——启发式深度优先搜索算法
求解带有限重的三维装箱问题——启发式深度优先搜索算法
95 4
ArcGIS:如何进行离散点数据插值分析(IDW)、栅格数据的重分类、栅格计算器的简单使用、缓冲区分析、掩膜?
ArcGIS:如何进行离散点数据插值分析(IDW)、栅格数据的重分类、栅格计算器的简单使用、缓冲区分析、掩膜?
434 0
|
6月前
用图直观上理解梯度算子(一阶)与拉普拉斯算子(二阶)的区别,线检测与边缘检测的区别
用图直观上理解梯度算子(一阶)与拉普拉斯算子(二阶)的区别,线检测与边缘检测的区别
205 1
|
6月前
|
算法 计算机视觉 芯片
[Halcon&定位] 二维仿射变换原理与算子解析
[Halcon&定位] 二维仿射变换原理与算子解析
317 0
|
数据挖掘
R实战 | 环状热图(circos)
R实战 | 环状热图(circos)
327 0
|
机器学习/深度学习 人工智能 自然语言处理
图算法的应用
图算法的应用
129 0
|
数据可视化
利用ggcor包绘制相关性组合图及环状热图
ggcor包最初是因为能快速实现19年Science一组合相关性图(上图所示)变得流行起来,除此该包对热图、热图等等的可视化都是很方便快捷的,除了之前介绍过的几种相关性图几种方式,此包也是个不错的选择,且具独特的风格(特别是组合相关性图、环形热图)。但是不知道因为何种原因此包在Github上消失了....,到作者(厚缊)个人博客上瞅了瞅发现关于包的参数介绍示例等也都没有了,在评论区里看到作者回答项目已不再提供任何代码和任何资料,需要的可以去国内的gitee和国外的github搜索看看有没有别人存的代码。
665 0