实验三-动态规划法求多段图问题.docxVIP

  • 53
  • 0
  • 约2.57千字
  • 约 4页
  • 2019-07-20 发布于浙江
  • 举报
本科实验报告 课程名称: 算法设计与分析 实验项目:动态规划法求多段图问题 实验地点: 专业班级: 学号: 学生姓名: 指导教师: 实验三 动态规划法求多段图问题 实验目的 掌握动态规划算法的基本思想 掌握多段图的动态规划算法 选择邻接表或邻接矩阵方式来存储图 4、分析算法求解的复杂度。 实验内容 设G=(V,E)是一个带权有向图,其顶点的集合V被划分成k2个不相交的子集Vi,1i=k,其中V1和Vk分别只有一个顶点s(源)和一个顶点t(汇)。图中所有边的始点和终点都在相邻的两个子集Vi和Vi+1中。求一条s到t的最短路线。参考讲义p136图5-24中的多段图,试选择使用向前递推算法或向后递推算法求解多段图问题。 实验环境 程序设计语言:c++ 编程工具:microsoft visual studio 2010 算法描述和程序代码 #include stdio.h #include stdlib.h #include conio.h #include iostream.h #define MAX 100 #define n 12 #define k 5 int c[n][n]; void init(int cost[]) //初始化图 { int i,j; for(i=0;i13;i++) { for(j=0;j13;j++) { c[i][j]=MAX; } } c[1][2]=9; c[1][3]=7; c[1][4]=3; c[1][5]=2; c[2][6]=4; c[2][7]=2; c[2][8]=1; c[3][6]=2; c[3][7]=7; c[4][8]=11; c[5][7]=11; c[5][8]=8; c[6][9]=6; c[6][10]=5; c[7][9]=4; c[7][10]=3; c[8][10]=5; c[8][11]=6; c[9][12]=4; c[10][12]=2;c[11][12]=5; } void fgraph(int cost[],int path[],int d[]) //使用向前递推算法求多段图的最短路径 { int r,j,temp,min; for(j=0;j=n;j++) cost[j]=0; for(j=n-1;j=1;j--) { temp=0; min=c[j][temp]+cost[temp]; //初始化最小值 for(r=0;r=n;r++) { if(c[j][r]!=MAX) { if((c[j][r]+cost[r])min) //找到最小的r { min=c[j][r]+cost[r]; temp=r; } } } cost[j]=c[j][temp]+cost[temp]; d[j]=temp; } path[1]=1; path[k]=n; for(j=2;jk;j++) path[j]=d[path[j-1]]; } void bgraph(int bcost[],int path1[],int d[])//使用向后递推算法求多段图的最短路径 { int r,j,temp,min; for(j=0;j=n;j++) bcost[j]=0; for(j=2;j=n;j++) { temp=12; min=c[temp][j]+bcost[temp]; //初始化最小值 for(r=0;r=n;r++) { if(c[r][j]!=MAX) { if((c[r][j]+bcost[r])min) //找到最小的r { min=c[r][j]+bcost[r]; temp=r; } } } bcost[j]=c[temp][j]+bcost[temp]; d[j]=temp; } path1[1]=1; path1[k]=n; for(int i=4;i=2;i--) { path1[i]=d[path1[i+1]]; } } void main() {

文档评论(0)

1亿VIP精品文档

相关文档