实验九 多段图的最短路径问题的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验九多段图的最短路径问题的设计与实现
一、实验目的
1.掌握动态规划算法的基本原理与方法
2.利用动态规划方法编程解决多段图的最短路径
二、实验要求
1.设计算法
2.写出相应程序
3.保存和打印出程序的运行结果,并结合程序进行分析。
三、实验内容
问题描述:设图G=(V, E)是一个带权有向连通图,如果把顶点集合V划分成k个互不相交的子集Vi(2≤k≤n, 1≤i≤k),使得E中的任何一条边(u, v),必有u∈Vi,v∈Vi+m(1≤i<k, 1<i+m≤k),则称图G为多段图,称s∈V1为源点,t∈Vk为终点。
多段图的最短路径问题是求从源点到终点的最小代价路径。
由于多段图将顶点划分为k个互不相交的子集,所以,多段图划分为k段,每一段包含顶点的一个子集。
不失一般性,将多段图的顶点按照段的顺序进行编号,同一段内顶点的相互顺序无关紧要。
假设图中的顶点个数为n,则源点s的编号为0,终点t的编号为n-1,并且,对图中的任何一条边(u, v),顶点u的编号小于顶点v的编号。
下面考虑多段图的最短路径问题的填表形式。
用一个数组cost[n]作为存储子问题解的表格,cost[i]表示从顶点i到终点n-1的最短路径,数组path[n]存储状态,path[i]表示从顶点i到终点n-1的路径上顶点i的下一个顶点。
则:
+cost[j]} (i≤j≤n且顶点j是顶点i的邻接点) (式3.7)cost[i]=min{c
ij
+cost[j]最小的j (式3.8)path[i]=使c
ij
算法:
四、程序代码
#include<stdio.h> #define MAX 100
void a(int p[][10]){ int cost[10]={0}; int path[10]={0}; int i,j,n;
for(i=0;i<10;i++) path[i]=-1; for(i=8;i>=0;i--) {
算法3.2——多段图的最短路径
1.初始化:数组cost[n]初始化为最大值,数组path[n]初始化为-1; 2.for (i=n -2; i>=0; i --)
2.1 对顶点i 的每一个邻接点j ,根据式
3.7计算cost[i]; 2.2 根据式3.8计算path[i]; 3.输出最短路径长度cost[0];
4. 输出最短路径经过的顶点: 4.1 i=0
4.2 循环直到path[i]=n -1
4.2.1 输出path[i]; 4.2.2 i=path[i];
path
0 1 2
3 4 5 6
7
8
int t=MAX;
for(j=9,n=0;j>=i&&p[i][j]!=0;j--)
{
if(p[i][j]!=MAX)
{
cost[i]=cost[j]+p[i][j];
if(t<=cost[i])
{
n++;
cost[i]=t;
path[i]=j+n;
}
else
path[i]=j;
t=cost[i];
// printf("%d %d\n",i,path[i]);
}
}
}
printf("0\t");
for(int i=0;path[i]!=9;i=path[i])
printf("%d\t",path[i]);
printf("9\n");
printf("\n最短路径为:%d",cost[0]);
}
int main(){
int p[10][10]={0,3,2,3,MAX,MAX,MAX,MAX,MAX,MAX,
3,0,MAX,MAX,8,6,MAX,MAX,MAX,MAX,
2,MAX,0,MAX,6,7,8,MAX,MAX,MAX,
3,MAX,MAX,0,MAX,4,7,MAX,MAX,MAX,
MAX,8,6,MAX,0,MAX,MAX,5,6,MAX,
MAX,6,7,4,MAX,0,MAX,8,6,MAX,
MAX,MAX,8,7,MAX,MAX,0,6,5,MAX,
MAX,MAX,MAX,MAX,5,8,6,0,MAX,7,
MAX,MAX,MAX,MAX,6,6,5,MAX,0,3,
MAX,MAX,MAX,MAX,MAX,MAX,MAX,7,3,0
};
a(p);
}
五、结果及分析。