




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机算法课程实验报告每对结点间最短路径院系: 计算机科学与技术 班级: 姓名: 学号: U200814470 Part one贪心法实现最短路径一、实验目的设计一个C程序,实现求解单源点最短路径问题。 二、实验要求本实验要求输出最短路径值以及最短路径 三、实验内容与原理 单源点最短路径问题,即,已知一个n结点有向图G(V,E)和边的权函数c(e),求由某指定结点V0到其他各个结点的最短路径,这里还假定所有的权都是正的。 为了制定产生最短路径的贪心算法,对于这个问题应该想出一个多级解决办法和一种最优的量度标准。方法之一是逐条构造这些最短路径,可以使用迄今已生成的所有路径长度之和作为一种量度,为了使这一量度达到最小,其单独的每一条路径都必须具有最小长度。使用这一量度标准时,假定已经构造了i条最短路径,则下面要构造的路径应该是下一条最短的最小长度路径。首先,生成从V0到所有其它结点的最短路径。然后生成一条到第二近结点的最短路径等等。四、程序流程图关键思想阐述:从v0开始,只通过S中的结点并且在S外的结点w初结束的最短路径可能会减小,即DIST(w)的值可能改变。如果长度改变了,则它必定是由一条从v0开始,经过u然后到w的跟段的路径所造成的。v0到y的路径以及u到w 的路径上的中间结点应全部在S中。而且,v0到u的路径必定是这样一条最短的路径,否则就不符合DIST(w)的定义英雌,可以得出结论,如果DIST(w)会减少,那是由于有一条从v0静u到w的更短的路,而从u到w的路径是边.这条路径的长度是DIST(U)+C(u,w)。分析得到程序流程图如下:五、算法及程序说明 本算法使用贪心法设计,生成从v0到所有其它结点的最短路径的贪心方法就是按照路径长度的非降次序生成这些路径。六、源程序/*单源点最短路径*/#includeint search(int*,int,int,int*,int);main() /*生成单源点最短路径的贪心算法*/int COST77=0,20,50,30,200,200,200,200,0,25,200,200,70,200,200,200,0,40,25,50,200,200,200,200,0,55,200,200,200,200,200,200,0,10,70,200,200,200,200,200,0,50,200,200,200,200,200,200,0; /*COSTij表示成本邻接矩阵,200表示无穷大*/ int front_point7=0,0,0,0,0,0,0;/*用来存放各结点的最短路径上的前一结点*/ int DIST7;/*DISTi表示第i个结点到源结点的路径长度*/ int S7;/*S中表示对其已经生成了最短路径的那些结点,Si=1表示第i个结点在S中,否则不在*/ int u,num,i,w,j,k; for(k=0;k7;k+) /*j对应到其他所有点的最短距离*/ for(i=0;i7;i+) front_pointi=k; for(i=0;i7;i+) Si=0;/*初始状态时,所有结点均不在S中*/ DISTi=COSTki;/*各结点到源结点的最短路径的初始长度为它们的直接距离*/ Sk=1;/*将源结点放入S中*/ DISTk=0;/*自身到自身的路径为0*/ for(num=2;num=6;num+) /*加入五个结点到S中,最后一个不需要*/ int min=32767; for(w=0;w=6;w+) /*找出不在S的结点中到源结点直接距离最短的结点*/ if(!Sw) if(DISTwmin) min=DISTw; u=w; /*将所找结点位置赋值给u*/ Su=1; /*将第u结点放入S中*/ for(w=0;w=6;w+) /*加入u结点后,重新计算非S中结点的DISTi*/ if(!Sw&(DISTu+COSTuw)DISTw) DISTw=DISTu+COSTuw;/*若新的路径短则更新原路径*/ front_pointw=u; getch(); printf(Cost adjacency matrixn); for(i=0;i=6;i+)/*输出所求结点图的邻接矩阵*/ for(j=0;j=6;j+) printf( %d ,COSTij); printf(n); printf(value Source node to each node of the shortest pathn); for(i=0;i=6;i+) /*输出结果*/ printf(v%d ,search(front_point,i,i,DIST,k)+1); printf(v%dn,i+1); getch();int search(int t,int n,int m,int D,int p) int q=tn; if(q=p) printf( %d ,Dm); return(p); else printf(v%d ,search(t,q,m,D,p)+1); return(tn); 六 实验结果测试数据为:0,20,50,30,200,200,200,200,0,25,200,200,70,200,200,200,0,40,25,50,200,200,200,200,0,55,200,200,200,200,200,200,0,10,70,200,200,200,200,200,0,50,200,200,200,200,200,200,0注:其中200的距离代表是对应路径没有路相连。 由以上测试数据绘出数据的有向图如下所示:实验结果如下:注:限于篇幅,仅给出v1,v2到其余各点的最短路径及路径值。 图11Part two动态规划实现最短路径一、实验目的与要求设计一个C程序,实现求解每对结点之间的最短路径问题。 二、实验要求本实验要求输出每对结点之间的最短路径值以及其最短路径 三、实验内容与原理 每对结点之间的最短路径问题是求满足下述条件的矩阵A,要求A中的任何元素A(i,j)是代表结点i到结点j的最短路径的长度。 考察G中一条由i到j的最路径,ij。这条路径由i出发,通过一些中间结点,在j处结束。如果k是这条最短路径上的一个中间结点,那么由i到k和由k到j的这两条子路径应分别是由i到k和由k到j的最短路径。否则,这条由i到j的路径就不是具有最小长度的路径。于是,最优性原理成立。如果k是编号最高的中间结点,那么由i到k的这条最短路径上就不会有比编号k-1更大的结点通过。同样,在k到j的那条最短路径上也不会有比编号k-1更大的结点通过。因此,可以把求取一条由i到j的最短路径看成是如下的过程:首先需要决策哪一个结点是该路径上具有最大编号的中间结点k,然后就再去求取由i到k和由k到j这两对结点之间的最短路径。当然,这两条路径上都不可能有比k-1还大的中间结点。四、程序流程图五、源程序/*每对结点之间的最短路径*/#includevoid main(void) /*求每对结点之间的最短路径*/ int cost33=0,4,11,6,0,2,3,100,0;/*输入所求结点图的邻接矩阵,100表示无穷大*/ int a33; /*结点之间的最短路径矩阵*/ int path333=0;/*存放结点对之间的路径,初值均为*/ int i,j,k; for(i=0;i=2;i+) for(j=0;j=2;j+) aij=costij;/*将costij复制到aij*/ for(k=0;k=2;k+) /*对最高下标为k的结点的路径*/ for(i=0;i=2;i+) /*对于所有可能的结点对*/ for(j=0;j(aik+akj) aij=aik+akj; pathijk=k;/*将k结点加入到结点对(i,j)的最短路径中*/ printf(Cost adjacency matrixn); for(i=0;i=3;i+)/*输出所求结点图的邻接矩阵*/ if(i) printf(v%d ,i);/*打印矩阵的行标v1,v2,,vn*/ for(j=0;j=2;j+) if(!i) printf( v%d,j+1);/*打印矩阵的列标*/ else printf(%d ,costi-1j); printf(n); printf(Node of Source node to each node of the shortest path valuen); for(i=0;i=2;i+)/*输出经算法产生的结点间的最短路径矩阵*/ for(j=0;j=2;j+) printf(v%dv%d ,i+1,j+1);/*打印结点对*/ printf(v%d ,i+1);/*打印每对结点之间的最短路径*/ for(k=0;k=2;k+) if(pathijk)/*打印出已存入的路径*/ printf(v%d ,pathijk+1); else /*对齐输出格式*/ printf( ); printf(v%d ,j+1); printf( %d nn,aij);/*打印最短路径值*/ getch();六、实验结果测试数据:0,4,11,6,0,2,3,100,0注:其中100表示没有该条路径,用一个相对很大的数代替无穷大。由以上测试数据得到如下测试数据图:2 41 6 11 33 2实验结果截图如下所示:七、实验感想及心得体会1 在做这个实验时,我一直在思考一个问题,这两个算法究竟有什么区别,因为我觉得第二个算法从设计思想以及到语言描述都比第一个算法第简单,但一个算法并未降低此问题的是时间复杂度,所以我觉得对于求单源路径使用动态规划的设计思想可使程序更简单。经过仔细分析才领悟到,单源路径的贪心算法过人之处在于:它能以较快的速度计算出v0到所有结点中最n短的路径长度。而动态规划则必须循环完所有的结点后才能得出某一对结点的最短路径长度2 由于课本上已经给出了实现此算法的形式化描述,所以此次课设相对以前的c以及数据结构来说,是比较简单的,但有一点,输出路径需要自己设计,关于这一点我考虑了两种方法:其中对于单源路径我使用的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年尿片行业研究报告及未来行业发展趋势预测
- 高速公路桥梁荷载测试方案
- 银行安保工作灭火演练预案范文
- 2025年CD架行业研究报告及未来行业发展趋势预测
- 2025年三维3D打印技术推广服务行业研究报告及未来行业发展趋势预测
- 2025年李子行业研究报告及未来行业发展趋势预测
- 2025年面条机压面机行业研究报告及未来行业发展趋势预测
- 旅游公路施工现场管理与控制方案
- 高难度地形混凝土施工方案
- 公园植被布局与绿化规划
- FABE销售法则销售培训课件
- 电力电子技术第五版(王兆安)课件全
- 人工智能导论课件
- 有效沟通:金字塔原则课件
- 苏科版三年级上册劳动第二课《学定时》课件(定稿)
- 中国古代的美育思想课件
- 心理学专业英语基础51057048
- 日周月安全检查记录表
- 重庆物业服务收费管理办法-重庆物价局
- 2021年中国华电集团公司组织架构和部门职能
- GA∕T 1046-2013 居民身份证指纹采集基本规程
评论
0/150
提交评论