多种方法求多段图的最短路径问题 算法设计与分析课程设计

多种方法求多段图的最短路径问题 算法设计与分析课程设计
多种方法求多段图的最短路径问题 算法设计与分析课程设计

学号:

《算法设计与分析B》

大作业

题目多种方法解决多段图的最短

路径问题

学院计算机科学与技术学院专业软件工程

班级

姓名

指导教师

2014 年12 月26 日

多种方法解决多段图的最短路径问题

摘要

多段图的最短路径问题是求从源点到终点的最小代价路径。本文主要描述的是分别用动态规划法、贪心法和分支限界法来解决多段图最短路径问题时的情况。文章首先阐述了各个方法的原理,主要的思路是通过输入一组数据,比较三者的输出结果的准确性以及运行时间,以之为基础来分析、讨论三者的性能区别。文章最后讲述了若这几种方法运行到有向图中的情况,几种方法的对比和它们比较适应的使用情况的讨论,并给出了自己的建议。

关键字:多段图最短路径问题;动态规划法;分支限界法;贪心法

目录

摘要................................................................. II

1 引言 (1)

2 问题描述 (1)

3 贪心法求解 (2)

3.1 贪心法介绍 (2)

3.2 问题分析 (3)

4 动态规划法求解 (3)

4.1 动态规划法介绍 (3)

4.2 问题分析 (4)

5 分支限界法求解 (5)

5.1 分支限界法介绍 (5)

5.2 问题分析 (5)

6 程序清单 (6)

6.1 源代码 (6)

6.2 结果截图 (9)

7 结果分析 (9)

8 课程体会 (10)

9 参考文献 (10)

1引言

当前社会,关于最短路径的问题屡屡出现。例如在开车自驾游的一个过程中,排除其它影响因素,从一个地点到另一点,这个时候必然是希望有一条距离最短的路程来尽量减少消耗的时间以及花费的(它们在模型中被称为代价),市场上对该问题的解决有很大的需求,因此,这里我将讨论多段图的最短路径的问题。

大二开设的《数据结构》课程中就包括最短路径这方面问题的讨论。当时老师介绍了分别面向单源(Dijkstra算法)与非单源(Floyd算法)两种问题的算法——这是我们最早的对最短路径方面的理解,也是我们接触的比较早的关于图的问题。

在这学期的《算法设计与分析》课程中,我们学习了很多基本的算法设计技术,蛮力法、分治法、减治法、动态规划法、贪心法、回溯法、分支限界法等,它们把以前学习的诸多方法都命名并归纳分类起来,其中有多种算法都可以用来解决最短路径问题,并且该问题作为一个图的问题,对该问题的继续探讨优化的需求很大、本文将就不同算法在解决该最短路径问题时的不同方法进行对比并给出该问题在不同基础上不同的最终解决方案。由于时间的限制,本文将重点分析动态规划法下的情况,并会对图的情况加以简化、限制,最后会对其它的图做一些拓展。

2问题描述

设图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的编号。

这里我们讨论的多段图是可以分段的,各段之间的关系最好是单向的,即对该有向图来说,图中是没有环的存在的。

3贪心法求解

3.1贪心法介绍

贪心法是一种简单有效的方法。它在解决问题的策略上只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变。

贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优。这种局部最优选择并不总能获得整体最优解,但通常能获得近似最优解。

本例中利用的贪心算法,是每当要选择下一个结点时,总是选择与当前结点间代价最小的点,这就叫做总是优先局部最优解,以此得到最终的解序列。这里举一个贪心法的拓展例子Dijkstra算法。

Dijkstra算法是一种最短路径算法,用于计算一个节点到其它所有节点的最短路径,动态路由协议OSPF中就用到了Dijkstra算法来为路由计算最短路径。

算法本身并不是按照我们的正常思维习惯,我们一般会从原点遍历所有与之相连的节点,找到最短路径,再从最短路径上的那个点遍历与之相连的所有其它点(原点除外),然后依次类推。这样做虽然可以算出一个树形,但是在大多数情况下,这种算法会产生很多次优路径,也就是说非最短路径。

Dijkstra算法的大概过程:

假设有两个集合或者说两个表,表A和表B,表A表示生成路径,表B表示最后确定的路径

(1)从原点出发,遍历检查所有与之相连的节点,将原点和这些节点存放到表A中,并记录下两节点之间的代价;

(2)将代价最小的代价值和这两节点移动到表B中(其中一个是原点);

(3)把这个节点所连接的子节点找出,放入到表A中,算出子节点到原点的代价;

(4)重复第二步和第三步直到表A为空。然后根据表B中的数据算出最优树。

维基百科中还有另一种说法,Dijkstra算法的输入包含了一个有权重的有向图G,以及G中的一个来源顶点S。我们以V表示G中所有顶点的集合。每一个图中的边,都是两个顶点所形成的有序元素对。(u,v)表示从顶点u到v有路径相连。我们以E所有边的集合,而边的权重则由权重函数w: E → [0, ∞]定义。因此,w(u,v)就是从顶点u到顶点v的非负

花费值(cost)。边的花费可以想像成两个顶点之间的距离。任两点间路径的花费值,就是该路径上所有边的花费值总和。已知有V中有顶点s及t,Dijkstra算法可以找到s到t的最低花费路径(i.e. 最短路径)。这个算法也可以在一个图中,找到从一个顶点s到任何其它顶点的最短路径。

3.2问题分析

以起始点为中心向外层层扩展,直到扩展到终点为止。

Dijstra算法(边的拓展){

While(!(每一个d[v]==最短路径))

If(存在一条从u到v的边)

If(d[u]+w(u,v)

d[v]= d[u]+w(u,v);}

4动态规划法求解

4.1动态规划法介绍

动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),可以人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。

动态规划是考察问题的一种途径,或是求解某类问题的一种方法。

动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比其它方法求解更为方便。

动态规划法设计算法一般分成三个阶段:

(1) 划分子问题:将原问题分解为若干个子问题,每个子问题对应一个决策阶段,并且子问题之间具有重叠关系;

(2) 确定动态规划函数:根据子问题之间的重叠关系找到子问题满足的递推关系式(即动态规划函数),这是动态规划法的关键;

(3) 填写表格:设计表格,以自底向上的方式计算各个子问题的解并填表,实现动态

规划过程。

4.2 问题分析

设数组cost[n]存储最短路径长度,cost[j]表示从源点s 到顶点j 的最短路径长度,数组path[n]记录状态转移,path[j]表示从源点到顶点j 的路径上顶点的前一个顶点,动态规划法求解多段图的最短路径问题的算法如下:

输入:多段图的代价矩阵 输出:最短路径长度及路径

1. 循环变量j 从1~n-1重复下述操作,执行填表工作: 1.1 考察顶点j 的所有入边,对于边(i, j)∈E : 1.1.1 cost[j]=min{cost[i]+cij}; 1.1.2 path[j]=使cost[i]+cij 最小的i; 1.2 j++;

2. 输出最短路径长度cost[n-1];

3. 循环变量i=path[n-1],循环直到path[i]=0: 3.1 输出path[i]; 3.2 i=path[i];

第一部分是依次计算各个顶点到终点的最短路径,由两层嵌套的循环组成,外层循环执行n-1次,内层循环对所有入边进行计算,并且在所有循环中,每条入边只计算一次。假定图的边数为m ,则这部分的时间性能是O(m);第二部分是输出最短路径经过的顶点,

原问题的解

原问题

子问题

子问题

子问题

设多段图划分为k 段,其时间性能是O(k)。所以,该算法的时间复杂性为O(n+k)。

5 分支限界法求解

5.1 分支限界法介绍

分支限界法按广度优先策略搜索问题的解空间树,在搜索过程中,对待处理的结点根据限界函数估算目标函数的可能取值,从中选取使目标函数取得极值(极大或极小)的结点优先进行广度优先搜索,从而不断调整搜索方向,尽快找到问题的解。

5.2 问题分析

讨论当用分支限界法用来解决多段图路径问题的过程:

首先对该多段图应用贪心法求得近似解,并算出其代价路径。将其作为多段图最短路径问题的上界。而把每一段最小的代价相加,可以得到一个非常简单的下界。于是,就可以得到了目标函数的一个大致的范围。

由于多段图将顶点划分为k 个互不相交的子集,所以,多段图划分为k 段,一旦某条路径的一些段被确定后,就可以并入这些信息并计算部分解的目标函数值的下界。一般情况下,对于一个正在生成的路径,假设已经确定了i 段(1≤i ≤k ),其路径为(r 1, r 2, …, r i , r i +1),此时,该部分解的目标函数值的计算方法即限界函数如下:

应用分支限界法同样求解多段图的最短路径问题,具体的搜索过程是这样进行的,首先考虑根节点,根据限界函数算出目标函数的值,这里每种情况下的目标函数值下界都要算出来并且加以比较,下界的计算方法为除了加上选定点与初始点之间的距离外,以后的第一个点选择一选定点为初始点到下段最小代价的路径,以后的段与段之间的代价都按它们之间最小的代价来计算。这样再加上根节点与初始阶段之间的最小代价,就得到这种情况下的解了。在得到的代价中,找出最小的代价,并以之为初始结点循环往下做,直到到达目标结点。

算法如下:

1.根据限界函数计算目标函数的下界down ;采用贪心法得到上界up ;

∑∑+=+>∈<=++

=

+k

i j p i E

v r i

j j j

j v r c r

r c lb p i 2

1,1

1]}][[{min

]

][[1段的最短边

第+

2.将待处理结点表PT初始化为空;

3.for (i=1; i<=k; i++) x[i]=0;

4.i=1; u=0; //求解第i段

5.while (i>=1)

5.1 对顶点u的所有邻接点v

5.1.1 计算目标函数值lb;

5.1.2 若lb<=up,则将i,,lb存储在表PT中;

5.2 如果i= =k-1且叶子结点的lb值在表PT中最小,

则输出该叶子结点对应的最优解;

5.3 否则,如果i= =k-1且表PT中的叶子结点的lb值不是最小,则

5.3.1 up=表PT中的叶子结点最小的lb值;

5.3.2 将表PT中目标函数值超出up的结点删除;

5.4 u=表PT中lb最小的结点的v值;

5.5 i=表PT中lb最小的结点的i值;i++;

6程序清单

6.1源代码

#include

const int N = 20;

const int MAX = 1000;

int arc[N][N];

int Backpath(int n);

int creatGraph();

int creatGraph()

{

int i, j, k;

int weight;

int vnum, arcnum;

cout<<"输入顶点的个数和边的个数:"<

cin>>vnum>>arcnum;

for (i = 0; i < vnum; i++)

for (j = 0; j < vnum; j++)

arc[i][j] = MAX;

for (k = 0; k < arcnum; k++)

{

cout<<"输入边的两个顶点和权值:";

cin>>i>>j>>weight;

arc[i][j] = weight;

}

return vnum;

}

int Backpath(int n)

{

int i, j, temp;

int cost[N];

int path[N];

for(i = 0; i < n; i++)

{

cost[i] = MAX;

path[i] = -1;

}

cost[0] = 0;

for(j = 1; j < n; j++)

{

for(i = j - 1; i >= 0; i--)

{

if (arc[i][j] + cost[i] < cost[j])

{

cost[j] = arc[i][j] + cost[i];

path[j] = i;

}

}

}

cout<

i = n-1;

while (path[i] >= 0)

{

cout<<"<-"<

i = path[i];

}

cout<

return cost[n-1];

}

int main()

{

int n = creatGraph( );

int pathLen = Backpath(n);

cout<<"最短路径的长度是:"<

return 0;

}

6.2结果截图

7结果分析

(1)贪心法、动态规划法和分支限界法都可以用来解决多段最短路径问题,然而在这种情况相比之下,贪心法的运算效率比较高,因为它不像另外两种方法一样,需要涉及到许多的点。可以看到,动态规划法由于需要填表,并有一个相关的迭代问题,它几乎涉及了所有的点;而分支限界法,它通过贪心法设置的上下限,并以它们为依据进行剪枝,减少了许多的运算量。而贪心法,访问了最少的点。

(2)就结果准确性来看,就本题例子来看,贪心法结果为0 2 4 7 9,路径的代价为20;动态分配法采取的路径为:0 3 5 8 9,路径的代价为16;而分支限界法,结果为0 3 5 8 9,路径的代价为16。可以看出,在这个方面,动态分配法和分支限界法都达到了预期的结果,相比直线,贪心法的误差就比较大了。

由以上的讨论,我们可以看出分支限界法的综合性能比较好,它和动态规划法在解决多段最短路径问题时都可以得到正确解,而贪心法虽然可以省时间与空间,但结果不准确

是它的缺点。各方法都是有利有弊的。因此在选择方法时,还应当根据实际情况。当只需要大概的一个解时,当然是要用省时省力的贪心法;如果对结果又比较高的要求的话,就要采取动态规划法或分支限界法。dijkstra算法的明显优点就是它的多用性,它可以求任意一点到其它某一点的距离,但是它访问的数据量很大,几乎要访问所有的边(相对于贪心法而言),因此这里来说,在单纯的解决多段最短路径问题时,它们的功能都差不多,而在解决其它较复杂的图时,Dijkstra算法有明显的优越性,但当然,作为贪心法的一种,它的结果的准确性不是那么的高。Dijkstra算法在本质上为贪心算法,每一步的选择为当前步的最优,复杂度为O(n*n)。动态规划法是可以看作是对分支限界法的改进。

其实,它们各有各的优缺点,可以尝试将它们混合起来用,扬长避短,设置范围,并且过程中对肯定不会是最后结果的数据“剪枝”。这样就可以提高运行速率了。

8课程体会

算法分析与设计是一门非常重要的课程。很多问题的解决,程序的编写都要依赖它,在软件还是面向过程的阶段,就有“程序=算法+数据结构”这个公式。算法的学习对于培养一个人的逻辑思维能力是有极大帮助的,它可以培养我们养成思考分析问题,解决问题的能力。作为IT行业学生,学习算法无疑会增强自己的竞争力,修炼自己的“内功”。

谢谢老师的指导,学习《算法分析与设计》使我对软件基础知识中算法的地位有了充分的了解,虽然课程结束了,但我依然还会继续学习算法分析与设计,以后我将充分利用所学到我实际的开发项目中。

9参考文献

[1]王红梅,胡明.算法设计与分析(第二版).北京:清华大学出版社.2013.4

[2]严蔚敏, 吴伟民. 数据结构(C语言版).北京:清华大学出版社.2010

[3] 余祥宣,催国华,邹海明.计算机算法基础(第三版)[M].武汉:华中科技大学出版社.2006

[4]卜月华.图论及其应用.南京:东南大学出版社.2000

大作业成绩评定表

教师签名:

班级

学号

姓名

大作业题目

多种方法解决多段图的最短路径问题

评阅点 评分标准(细则) 分值

实得分

算法设计与实现 (40分)

正确实现本程序所需全部功能,算法设计正确合理且有一定创新,结果正确

40分

实现所需功能,算法正确,结果正确 30分 基本实现所需功能,结果正确 15分 有明显重大错误 5分 无法实现程序功能 0分 算法分析 (20分)

算法分析全面、详细、正确

20分

算法分析比较全面、正确 15分 算法分析基本正确 10分 算法分析有明显错误

5分 程序可读、可维护性 (10分)

程序可读性好、逻辑清晰,程序完整,可维护性好

10分

程序可读、可维护 8分 基本可读可维护 5分 逻辑混乱、不可读

0分 报告质量 (20分)

报告规范,符合技术用语要求,行文流畅,层次清晰

20分

报告书写基本规范,符合技术用语要求,文理较通畅

15分 结构较合理,层次较清楚,基本符合要求 10分 结构混乱,文不对题目,或者有明显抄袭现象

5分 设计验收

好10分;通过8分;基本合格6分

10分

总 分

专题训练之最短路径问题(最全面的经典例题)

最短路径问题 1、①如右图是一个棱长为4的正方体木块,一只蚂蚁要从木块的点面 爬到点B处,则它爬行的最短路径是 _______________ 。 ②如右图是一个长方体木块,已知AB=3,BC=4,CD=2假设一只蚂蚁在点A处, 它要沿着木块侧面爬到点D处,则蚂蚁爬行的最短路径是____________________ 。 2、①如图,要在河边修建一个水泵站,分别向张村、李庄送水,水泵站修在河边什么地方可使所用的水管最短。 *李庄 张村. ②如图,直线L同侧有两点A B,已知A、B到直线L的垂直距离分别为1和3, 两点的水平距离为3,要在直线L上找一个点P,使PA+PB勺和最小。请在图中找出点P的位置,并计算PA+P啲最小值。.B A■ _____________________ L ③要在河边修建一个水泵站,向张村、李庄铺设管道送水,若张村、李庄到河边的垂直距离分别为1Km和3Km张村与李庄的水平距离为3Km则所用水管最短长度为。 A沿木块侧 A B

是一个长方体木块,已知 AB=5,BC=3,CD=4假设一只蚂 蚁在点A D 处,则蚂蚁爬行的最短路径是2、 现要在如图所示的圆柱体侧面 A 点与B 点之间缠一条金丝带(金丝带的宽度 忽略不计),圆柱体高为6cm 底面圆周长为16cm ,则所缠金丝带长度的最小值 为 。 3、 如图是一个圆柱体木块,一只蚂蚁要沿圆柱体的表面从 A 点爬到点B 处吃到 食物,知圆柱体的高为5 cm ,底面圆的周长为24cm 则蚂蚁爬行的最短路径 为 。 5、 在菱形ABCD 中 AB=2 / BAD=60,点E 是AB 的中点,P 是对角线 AC 上 的一个动点,贝S PE+PB 勺最小值为 ___________ 。 6、 如图,在△ ABC 中, AC= BC= 2,Z ACB= 90°, D 是 BC 边的中点,E 是 AB 边 上一动点,则EO ED 的最小值为 ____________ 。 7、 AB 是OO 的直径,AB=2 OC 是O O 的半径,OCL AB,点 D 在 AC 上,AD 二 2CD 点P 是半径OC 上的一个动点,贝S AP+PD 勺最小值为 __________ 。 &如图,点P 关于OA OB 的对称点分别为 C D,连接CD 交OA 于M 交OB 于N 若CD= 18cm 则厶PMN 勺周长为 ___________ 。 9、已知,如图DE >^ ABC 的边AB 的垂直平分线,D 为垂足,DE 交BC 于 E ,且 AC= 5, BC= 8,则厶 AEC 的周长为 __________ 。 10、已知,如图,在△ ABC 中, AB

数据结构,课程设计,校园最短路径问题

一、课程设计题目:校园最短路径问题 二、课程设计目的: 1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所具备的科学工作方法和作风。 三、课程设计要求: 1.设计的题目要求达到一定的工作量(300行以上代码),并具有一定的深度和难度。 2.编写出课程设计报告书,内容不少于10页(代码不算)。 四、需求分析: 1、问题描述 图的最短路径问题是指从指定的某一点v开始,求得从该地点到图中其它各地点的最短路径,并且给出求得的最短路径的长度及途径的地点。除了完成最短路径的求解外,还能对该图进行修改,如顶点以及边的增删、边上权值的修改等。 校园最短路径问题中的数据元素有: a) 顶点数 b) 边数 c) 边的长度 2、功能需求 要求完成以下功能: a)输出顶点信息:将校园内各位置输出。 b)输出边的信息:将校园内每两个位置(若两个位置之间有直接路径)的 距离输出。 c)修改:修改两个位置(若两个位置之间有直接路径)的距离,并重新输 出每两个位置(若两个位置之间有直接路径)的距离。 d)求最短路径:输出给定两点之间的最短路径的长度及途径的地点或输出 任意一点与其它各点的最短路径。 e)删除:删除任意一条边。 f)插入:插入任意一条边。 3、实现要点 a) 对图的创建采用邻接矩阵的存储结构,而且对图的操作设计成了模板类。 为了便于处理,对于图中的每一个顶点和每一条边都设置了初值。 b) 为了便于访问,用户可以先输出所有的地点和距离。 c) 用户可以随意修改两点之间好的距离。 d) 用户可以增加及删除边。 e) 当用户操作错误时,系统会出现出错提示。 五、概要设计:

多项式分治,背包问题,单元最短路径,克鲁斯卡尔,多段图

算法设计与分析大作业 班级:物联网1401 学号: 姓名:zk 江南大学物联网工程学院

一、多项式分治 1.1算法简介 分治字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 因为多项式的表示是Pn(x)= a n x n+a n-1x n-1+…+a1x+a0 任意大整数都可以看作是一多项式(其中X=10,a n是第n+1位上的数字,个位用a0表示)。如:9876=6+7*101+8*102+9*103 所以大整数相乘可以用多项式乘积的分治算法实现,实际上大整数相乘就是多项式乘积的一个特例。把一个多项式分为两个 P (x)= P0(x)+ P1(x)x n/2 q(x)=q0(x)+q1(x)x n/2 P(x)*q(x)=P0(x)*q0(x)+P1(x)*P1(x)*x n+((P0(x)+ P1(x))*( q0(x)+q1(x))- P0 * q0– P1* q1)* x n/2 令:R0= P0(x)*q0(x) R1= P1(x)*q1(x) R2= P0(x)+ P1(x))*( q0(x)+q1(x))- P0 * q0– P1* q1 于是上式可化简为P(x)*q(x)= R0 +(R2- R0- R1)* x n/2+ R1*x n 由于多项式乘法时间远多于加法时间,所以多项式乘积分治算法对比较大的n将有很大的改进。 1.2调试过程 ①在调试过程中poly_product()函数出错,单步调试发现 图1poly_product()错误部分 第16,17行出错,多项式阶数相同系数相加,所以讲r2+k改为r2或17,18行r3改为r3+k 即可。 ②多项式的输入只能是2的倍数。 1.3运行结果

关键路径问题报告

滁州学院 课程设计报告 课程名称:数据结构 设计题目:关键路径问题 院部:计算机与信息工程 专业:网络工程 组别:第六组 起止日期:2012年4月9日~2012年6月24日指导教师:赵玉艳 计算机与信息工程学院二○一二年制

课程设计题目关键路径问题 组长柯焱芳学号2011211384 班级网工113班院部计算机工程系专业网络工程 组员靳梦婷李鹏飞陆勇刘宜雨 指导教师赵玉艳 课程设计目的1.巩固和加深学生对数据结构课程基本知识的理解,综合该课程中所学的理论知识,独立或联合完成一个数据结构应用课题的设计; 2.根据选题需要,通过查阅手册和文献资料,培养分析和解决实际问题的能力; 3.熟练掌握图的各种基本数据结构的定义、存储结构和相应的算法,并可熟练利用c语言进行实现; 4.具有一定的算法设计和分析能力,掌握选用合适的数据结构解决实际问题的方法; 5.学会撰写课程设计报告,能做出简单答辩; 6.培养严肃认真的工作作风和严谨求实的科学态度。 课程设计所需环境 ⑴实验设备:PC机⑵操作系统:Windows XP ⑶开发环境:Visio C++6.0 课程设计任务要求要求学生理解图的特征和性质,掌握各类图的存储结构、相关操作的程序实现以及图的应用,能够利用图的遍历、图的最小生成树、最短路径、关键路径、拓扑排序等原理解决实际问题。 课程设计工作进度计划 序号起止日期工作内容分工情况 1 4.09-4.16 选题与分析课题内容, 查找资料柯焱芳:选题与分析课题内容 陆勇靳梦婷李鹏飞刘宜雨:查找资料 2 4.17-4.25 编写创建图,求最大路 径的函数刘宜雨靳梦婷:创建图李鹏飞陆勇:求最大路径 3 4.26- 5.16 编写总代码和主函数 (求关键路径) 柯焱芳:编写总代码和主函数(求关键路径) 4 5.17-5.2 5 对程序输入改写柯焱芳靳梦婷:对程序输入改写 5 5.26-6.10 对程序进行测试柯焱芳靳梦婷刘宜雨陆勇李鹏飞 6 6.11-6.24 整理文档与总结柯焱芳陆勇 指导教师签字:年月日院(系)审核意见 院长(主任)签字:年月日

数据结构课程设计报告Dijkstra算法求最短路径

中南大学 《数据结构》课程设计 题目第9题 Dijkstra算法求最短路径 学生姓名 XXXX 指导教师 XXXX 学院信息科学与工程学院 专业班级 XXXXXXX 完成时间 XXXXXXX

目录 第一章问题分析与任务定义---------------------------------------------------------------------3 1.1 课程设计题目-----------------------------------------------------------------------------3 1.2 原始数据的输入格式--------------------------------------------------------------------3 1.3 实现功能-----------------------------------------------------------------------------------3 1.4 测试用例-----------------------------------------------------------------------------------3 1.5 问题分析-----------------------------------------------------------------------------------3 第二章数据结构的选择和概要设计------------------------------------------------------------4 2.1 数据结构的选择--------------------------------------------------------------------------4 2.2 概要设计-----------------------------------------------------------------------------------4 第三章详细设计与编码-----------------------------------------------------------------------------6 3.1 框架的建立---------------------------------------------------------------------------------6 3.2 点结构体的定义---------------------------------------------------------------------------7 3.3 创立带权值有向图------------------------------------------------------------------------8 3.4 邻接矩阵的显示---------------------------------------------------------------------------9 3.5 递归函数的应用---------------------------------------------------------------------------10 3.6 Dijkstra算法实现最短路径--------------------------------------------------------------10 第四章上机调试------------------------------------------------------------------------------------11 4.1 记录调试过程中错误和问题的处理---------------------------------------------------11 4.2 算法的时间课空间性能分析------------------------------------------------------------11 4.3 算法的设计、调试经验和体会---------------------------------------------------------11 第五章测试结果-----------------------------------------------------------------------------------12 第六章学习心得体会-----------------------------------------------------------------------------12 第七章参考文献-----------------------------------------------------------------------------------12 附录------------------------------------------------------------------------------------------------------12

关键路径问题设计与实现

《数据结构的课程设计》 报告 题目:关键路径问题设计与实现班级:1612401 学号:161240113 姓名:张修鸣 指导老师:孙涵 完成日期:2014.1.3

目录 一.需求分析. 二.程序主要功能. 三.程序运行平台. 四.程序类说明. 五.模块分析. 六.存在的不足与对策. 七.体验感悟 八.程序源代码.

需求分析 设计并实现关键路径的一种应用。 程序主要功能 (1)实现拓扑排序和关键路径的发现。 (2)给出一个具体的应用环境。 程序运行平台 该程序是用VC++6.0制做的,使用Microsoft Visual C++ 6.0运行该程序,具体操作是:打开Microsoft Visual C++ 6.0,菜单栏里点文件→打开工作区→找到“图书管理系统.dsw”这个文件→打开,或者在资源管理器中双击该文件,此时,VC++6.0会自动打开,并载入该系统相关资源,点击Run命令菜单或者或用快捷键Ctrl+F5运行该程序。 程序类说明 typedef struct node{ int adjvex; //邻接点域 int time;//活动持续时间 struct node *next; }Node; Node *p; typedef struct VertexNode{ int vertex; //顶点域 int indegree; //入度域 Node *firstedge; //边表头指针 }AdjList[20]; typedef struct{ AdjList adjlist;//邻接表 int Dian;//顶点数

int Bian; //边数 }ALGraph 函数分析: void CreateALGraph(ALGraph *&G) //建立有向图 int TopoSort(ALGraph *G,int s[20],int ve[20]) //拓扑排序并求各顶点事件的最早发生时间及拓扑逆序列 int CriticalPath(ALGraph *G)//求关键路径和关键活动 模块分析 文件的信息 关键活动与关键路径 存在的不足与对策 由于自身能力有限,所以没有设计好交互界面。 在设计过程中由于设计者的编程功底欠缺,因此学习过程较为艰辛,需要解决的问题也比较多。在以后的学习中,应该循序渐进,不可急于求成,先打好基础,这样才能更好地发展。

动态规划算法实现多段图的最短路径问题算法设计与分析实验报告

动态规划算法实现多段图的最短路径问题算法设计与分析实验报告

算法设计与分析实验报告 实验名称 动态规划算法实现多段图的最短路径问题 评分 实验日期 年 月 日 指导教师 姓名 专业班级 学号 一.实验要求 1. 理解最优子结构的问题。 有一类问题的活动过程可以分成若干个阶段,而且在任一阶段后的行为依赖于该阶段的状态,与该阶段之前的过程如何达到这种状态的方式无关。这类问题的解决是多阶段的决策过程。在50年代,贝尔曼(Richard Bellman )等人提出了解决这类问题的“最优化原理”,从而创建了最优化问题的一种新的算法设计方法-动态规划。 对于一个多阶段过程问题,是否可以分段实现最优决策,依赖于该问题是否有最优子结构性质,能否采用动态规划的方法,还要看该问题的子问题是否具有重叠性质。 最优子结构性质:原问题的最优解包含了其子问题的最优解。 子问题重叠性质:每次产生的子问题并不总是新问题,有些子问题被反复计算多次。问题的最优子结构性质和子问题重叠性质是采用动态规划算法的两个基本要素。 2.理解分段决策Bellman 方程。 每一点最优都是上一点最优加上这段长度。即当前最优只与上一步有关。 U s 初始值,u j 第j 段的最优值。 ? ????+==≠}.{min , 0ij i j i j s w u u u

3.一般方法 1)找出最优解的性质,并刻画其结构特征;2)递归地定义最优值(写出动态规划方程);3)以自底向上的方式计算出最优值; 4)根据计算最优值时得到的信息,构造一个 最优解。 步骤1-3是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤4可以省略,步骤3中记录的信息也较少;若需要求出问题的一个最优解,则必须执行步骤4,步骤3中记录的信息必须足够多以便构造最优解。 二.实验内容 1.编程实现多段图的最短路径问题的动态规 划算法。 2.图的数据结构采用邻接表。 3.要求用文件装入5个多段图数据,编写从文件到邻接表的函数。 4.验证算法的时间复杂性。 三.程序算法 多段图算法: Procedure FGRAPH(E,k,n,P) //输入是按段的顺序给结点编号的,有n个结点的k段图。E是边集,c(i,j)是边的成本。P(1:k)是最小成本路径。// real COST(n),integer(n-1),P(k),r,j,k,n COST(n)<-0 for j<-n-1 to 1 by -1 do //计算COST(j)// 设r是一个这样的结点,(j,r) E且使c(j,

排列组合中的最短路径问题

两个计数原理的应用 一、选择题 1.如图,小明从街道的E处出发,先到F处与小红会合,再一起到位于G处的老年公寓参加志愿者活动,则小明到老年公寓可以选择的最短路径条数为【答案】B (A)24 (B)18 (C)12 (D)9 【解析】 试题分析:由题意,小明从街道的E处出发到F处最短路径的条数为6,再从F处到G ?=,故处最短路径的条数为3,则小明到老年公寓可以选择的最短路径条数为6318 选B. 【考点】计数原理、组合 【名师点睛】分类加法计数原理在使用时易忽视每类中每一种方法都能完成这件事情,类与类之间是相互独立的;分步乘法计数原理在使用时易忽视每步中某一种方法只是完成这件事的一部分,而未完成这件事,步步之间是相互关联的. 2.如图,一只蚂蚁从点出发沿着水平面的线条爬行到点,再由点沿着置于水平面的长方体的棱爬行至顶点,则它可以爬行的不同的最短路径有( B )条

A. 40 B. 60 C. 80 D. 120 【解析】试题分析:蚂蚁从到需要走五段路,其中三纵二竖,共有条路径,从到共有条路径,根据分步计数乘法原理可知,蚂蚁从到可以爬行的不同的最短路径有条,故选B. 考点:分步计数乘法原理. 二、解答题 3.某城市有连接8个小区A、B、C、D、E、F、G、H和市中心O的整齐方格形道路网,每个小方格均为正方形,如图,某人从道路网中随机地选择一条最短路径,由小区A前往H. (1)列出此人从小区A到H的所有最短路径(自A至H依次用所经过的小区的字母表示); (2)求他经过市中心O的概率. 【答案】(1)见解析(2)2 3 【解析】 解:(1)此人从小区A前往H的所有最短路径为:

《数据结构课程设计》最短路径问题实验报告

《数据结构课程设计》最短路径问题实验报告

目录 一、概述 0 二、系统分析 0 三、概要设计 (1) 四、详细设计 (5) 4.1建立图的存储结构 (5) 4.2单源最短路径 (6) 4.3任意一对顶点之间的最短路径 (7) 五、运行与测试 (8) 参考文献 (11) 附录 (12)

交通咨询系统设计(最短路径问题)一、概述 在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一个交通咨询系统。在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市间的耗费。这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从A城到B城途中中转次数最少;如何选择一条路径使得从A城到B城里程最短;如何选择一条路径使得从A城到B城花费最低等等的一系列问题。 二、系统分析 设计一个交通咨询系统,能咨询从任何一个城市顶点到另一城市顶点之间的最短路径(里程)、最低花费或是最少时间等问题。对于不同的咨询要求,可输入城市间的路程、所需时间或是所需费用等信息。 针对最短路径问题,在本系统中采用图的相关知识,以解决在实际情况中的最短路径问题,本系统中包括了建立图的存储结构、单源最短问题、对任意一对顶点间最短路径问题三个问题,这对以上几个问题采用了迪杰斯特拉算法和弗洛伊德算法。并未本系统设置一人性化的系统提示菜单,方便使用者的使用。

三、概要设计 可以将该系统大致分为三个部分: ①建立交通网络图的存储结构; ②解决单源最短路径问题; ③实现两个城市顶点之间的最短路径问题。

迪杰斯特拉算法流图:

栈的课程设计完整版

唐山学院 数据结构课程设计 题目栈的基本操作及其应用 系 (部) 计算机科学与技术系 班级 16计本(2) 姓名周登旺 学号 4164001232 指导教师郭琳虹 2018 年 1 月8日至2018 年1 月12日共1 周

数据结构课程设计任务书

课程设计成绩评定表

1.引言 在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶的地址增大。首先系统或者数据结构栈中数据内容的读取与插入(压入push和弹出pop)是两回事!插入是增加数据,弹出是删除数据,这些操作只能从栈顶即最低地址作为约束的接口界面入手操作,但读取栈中的数据是随便的没有接口约束之说。很多人都误解这个理念从而对栈产生困惑。而系统栈在计算机体系结构中又起到一个跨部件交互的媒介区域的作用即cpu与内存的交流通道,cpu只从系统给我们自己编写的应用程序所规定的栈入口线性地读取执行指令,用一个形象的词来形容它就是pipeline(管道线、流水线)。cpu内部交互具体参见EU与BIU的概念介绍。栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。栈可以用来在函数调用的时候存储断点,做递归时要用到栈! 一、基本概念 栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线形表。 栈是一种数据结构,是只能在某一端插入和删除的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表(LIFO表),栈可以用来在函数调用的时候存储断点,做递归时要用到栈! 本课程设计涉及的主要内容是对栈进行基本操作和实现栈的一些实际应用,在课程设计中,系统开发平台为Windows 7。程序设计语言使用Visual c++。程序的运行平台为Windows 2000/XP/7/10。 /* 2问题分析 本次课程设计主要介绍栈的概念和栈的基本操作和栈的两种存储结构及其应用。其中栈的基本操作主要包括置空栈,判断栈空,进栈,出栈,取栈顶元素。栈的两种存储

动态规划算法实现多段图的最短路径问题算法设计与分析实验报告

算法设计与分析实验报告 实验名称 动态规划算法实现多段图的最短路径问题 评分 实验日期 年 月 日 指导教师 姓名 专业班级 学号 一.实验要求 1. 理解最优子结构的问题。 有一类问题的活动过程可以分成若干个阶段,而且在任一阶段后的行为依赖于该阶段的状态,与该阶段之前的过程如何达到这种状态的方式无关。这类问题的解决是多阶段的决策过程。在50年代,贝尔曼(Richard Bellman )等人提出了解决这类问题的“最优化原理”,从而创建了最优化问题的一种新的算法设计方法-动态规划。 对于一个多阶段过程问题,是否可以分段实现最优决策,依赖于该问题是否有最优子结构性质,能否采用动态规划的方法,还要看该问题的子问题是否具有重叠性质。 最优子结构性质:原问题的最优解包含了其子问题的最优解。 子问题重叠性质:每次产生的子问题并不总是新问题,有些子问题被反复计算多次。问题的最优子结构性质和子问题重叠性质是采用动态规划算法的两个基本要素。 2.理解分段决策Bellman 方程。 每一点最优都是上一点最优加上这段长度。即当前最优只与上一步有关。 U s 初始值,u j 第j 段的最优值。 3.一般方法 1) 找出最优解的性质,并刻画其结构特征; 2) 递归地定义最优值(写出动态规划方程); 3) 以自底向上的方式计算出最优值; 4) 根据计算最优值时得到的信息,构造一个最优解。 步骤1-3是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤4可以省略,步骤3中记录的信息也较少;若需要求出问题的一个最优解,则必须执行步骤4,步骤3中记录的信息必须足够多以便构造最优解。 二.实验内容 1.编程实现多段图的最短路径问题的动态规划算法。 2.图的数据结构采用邻接表。 ?? ???+==≠}. {min , 0ij i j i j s w u u u

数据结构课程设计报告_最短路径C++

青岛理工大学琴岛学院 设计报告 课题名称:求解最优交通路径 学院:计算机工程系 专业班级:计算机科学与技术 学号:####### 学生:** 指导教师:** 青岛理工大学琴岛学院教务处 2011 年 7 月 7日

图1 B.具体功能实现及相应的弗洛伊德算法 首先,建立查询信息对话框,使用户能够录入需要查询的城市代号,并显示路径长度及最短路径沿途经过的城市。并相应地添加如下变量int m_v0;int m_v1;int m_lj;CString m_zd; 具体代码如下: #define MAXV 25 //最大顶点个数 #define INF 32767 //用32767表示∞ //以下定义邻接矩阵类型 typedef struct { int no; //顶点编号 char name[10]; //顶点名称 } VertexType; //顶点类型 typedef struct //图的定义 { int edges[MAXV][MAXV]; //邻接矩阵 int vexnum,arcnum; //顶点数,弧数 VertexType vexs[MAXV]; //存放顶点信息 } MGraph; //图的邻接矩阵类型 1.通过函数CreatUDN()存放城市路径信息,输入顶点之间的路径长度,创建带权图的邻接矩阵。 void CTDialog::CreatUDN() { MGraph *g=(MGraph*)malloc(sizeof(MGraph)); int i,j; for(i=0;iedges[i][j]=INF; if(i==j)g->edges[i][j]=0; //初始化置任意两城市之间距离为无穷大,即两城市之间没有直接通路

关键路径的查找实验报告

中国矿业大学矿业工程学院 实验报告 课程名称计算机软件设计基础 姓名 xxxx 班级采矿10-8班学号 xxxxx 日期 2012年10月 成绩教师 xxxx

3.2算法步骤:

(1)输入e条弧,建立AOE网的存储结构。 (2)从源点v1出发,令ve(1)=0,求ve(j),2<=j<=n。 (3)从汇点vn出发,令vl(n)=ve(n),求vl(i) 1<=i<=n-1。 (4)根据各顶点的ve和vl值,求每条弧s(活动)的最早开始时间e(s)和最晚开始时间l(s),其中e(s)=l(s)的为关键活动。 总结 首先,关于程序方面,我发现即使对设计思路有了眉目,知道了所要用到的数据结构、用邻接表来存储AOE-网、建立栈来求拓扑序列、输出的拓扑序列的个数少于节点数则有回路等等,要把这些方法写成函数代码,其实还是一件非常不容易的事情。再加上要完善设计思路,构造整个程序框架在内,都是一件工作量非常大的工作。 在处理程序代码的时候,有两个问题始终解决不了。一是程序输入时只能输入整形数据,而非整形的输入则会导致程序异常停止,但是因为整形的输入方式已贯穿整个程序,若要修改只能另外重做整个程序,所以暂不考虑修改,而打算做一个判错系统,判断若非整形的输入则报错;二是第一种错误的解决方案未能成功实行,于网路上搜索到了几种判断是否为整形数据的程序代码,但将其修改融合到求关键路径的程序中,虽然没有错误可以运行,但是却不能正确的报错。 于是,在尝试多种方案却仍不成功的前提下,我只好选择加上提示语,即:printf("请输入某项目的信息,并请用整形数字表示(格式:弧头,

数据结构课程设计:拓扑排序和关键路径复习进程

数据结构课程设计:拓扑排序和关键路径

1 ABSTRACT 1.1图和栈的结构定义 struct SqStack////栈部分 { SElemType *base;//栈底指针 SElemType *top;//栈顶指针 int stacksize;//栈的大小 int element_count;//栈中元素个素 }; /////////AOE网的存储结构 struct ArcNode //表结点 { int lastcompletetime;//活动最晚开始时间 int adjvex; //点结点位置 int info; //所对应的弧的权值 struct ArcNode *next;//指向下一个表结点指针 }; struct VNode //点结点 { VertexType data; //结点标志 int indegree; //该结点入度数 int ve; //记录结点的最早开始时间 int vl; //记录结点的最晚开始时间 struct ArcNode *first_out_arc; //存储下一个出度的表结点struct ArcNode *first_in_arc;//存储下一个入度的表结点 }; struct ALGraph

{ VNode *vertices; //结点数组 int vexnum; //结点数 int arcnum; //弧数 int kind; //该图的类型 }; 2系统总分析 2.1关键路径概念分析 2.1.1什么是关键路径 关键路径法(Critical Path Method, CPM)最早出现于20世纪50年代,它是通过分析项目过程中哪个活动序列进度安排的总时差最少来预测项目工期的网络分析。这种方法产生的背景是,在当时出现了许多庞大而复杂的科研和工程项目,这些项目常常需要运用大量的人力、物力和财力,因此如何合理而有效地对这些项目进行组织,在有限资源下以最短的时间和最低的成本费用下完成整个项目就成为一个突出的问题,这样CPM就应运而生了。对于一个项目而言,只有项目网络中最长的或耗时最多的活动完成之后,项目才能结束,这条最长的活动路线就叫关键路径(Critical Path),组成关键路径的活动称为关键活动。 2.1.2关键路径特点 关键路径上的活动持续时间决定了项目的工期,关键路径上所有活动的持续时间总和就是项目的工期。 关键路径上的任何一个活动都是关键活动,其中任何一个活动的延迟都会导致整个项目完工时间的延迟。

(完整版)初中数学[最短路径问题]典型题型及解题技巧

初中数学[最短路径问题]典型题型及解题技巧 最短路径问题中,关键在丁,我们善丁作定点关丁动点所在直线的对称点,或利用平移和 展开图来处理。这对丁我们解决此类问题有事半功倍的作用。理论依据:“两点之间线段最短”, “垂线段最短”,“点关丁线对称”,“线段的平移” “立体图形展开图”。教材中的例题“饮马问 题”,“造桥选址问题” “立体展开图”。考的较多的还是“饮马问题”。 知识点:“两点之间线段最短问题”,“造桥选址问题”。考的较多的还是“饮马问题”,出题背景变式有角、三角形、菱形、矩形、正方形、梯形、圆、坐标轴、抛物线等。 解题总思路:找点关丁线的对称点实现“折”转“直”,近两年出现“三折线”转“直”等变式问题考查。 一、两点在一条直线异侧 例:已知:如图,A , B在直线L的两侧,在L上求一点P,使得PA+PB * 最小。? 解:连接AB,线段AB与直线L的交点P,就是所求。(根据:两点之间线 二、两点在一条直线同侧 例:图所示,要在街道旁修建一个奶站,向居民区A、B提供牛奶,奶站应建在什么地 方,才能使从A、B到它的距离之和最短. 虻叩 解:只有A、C、B在一直线上时,才能使AC+BC最小.作点A关丁直线“街道”的对称点A',然后连接A ' B,交“街道” 丁点C,则点C就是所求的点. 、一点在两相交直线内部 例:已知:如图A是锐角Z MON内部任意一点,在Z MON的两边 OM , ON上各取一点B, C,组成三角形,使三角形周长最小 的两边

解:分别作点A关丁OM , ON的对称点A' , A〃;连接A' , A〃,分别交 OM , ON 丁点B、点C ,则点B、点C即为所求 分析:当AB、BC和AC三条边的长度恰好能够体现在一条直线上时,三角形的周长最小 例:如图,A.B两地在一条河的两岸,现要在河上建一座桥MN ,桥造在何 处才能使从A到B的路径AMNB最短?(假设河的两岸是平行的直线,桥要与河垂直)解:1.将点B沿垂直与河岸的方向平■移一个河宽到E, 2. 连接AE交河对岸与点M, 则点M为建桥的位置,MN为所建的桥。 证明:由平移的性质,得BN// EM 且BN=EM, MN=CD, BD // CE, BD=CE, 所以A.B 两地的距:AM+MN+BN=AM+MN+EM=AE+MN, 若桥的位置建在CD处,连接AC.CD.DB.CE, 则AB两地的距离为: AC+CD+DB=AC+CD+CE=AC+CE+MN, 在/\ACE 中,v AC+CE >AE,二AC+CE+MN >AE+MN,即AC+CD+DB 所以桥的位置建在CD处,AB两地的路程最短。 例:如图,A、B是两个蓄水池,都在河流a的同侧,为了方便灌溉 作物,?要在河边建一个抽水站,将河水送到A、B两地,问该站建在 A\M f —广11 B >AM+MN+BN

实验四图的最短路径弗洛伊德算法实现

数据结构与算法课程实验报告实验四:图的相关算法应用 姓名:王连平 班级:09信科2班 学号:I09630221

实验四图的相关算法应用 一、实验内容 求有向网络中任意两点之间的最短路。 二、实验目的 掌握图和网络的定义,掌握图的邻接矩阵、邻接表和十字链表等存储表示。掌握图的深度和广度遍历算法,掌握求网络的最短路的标号法和floyd算法。 三、问题描述 对于下面一张若干个城市以及城市间距离的地图,从地图中所有可能的路径中求出任意两个城市间的最短距离及路径,给出任意两个城市间的最短距离值及途径的各个城市。 四、问题的实现 4.1数据结构的抽象数据类型定义和说明 1) typedef struct ArcCell{//储存弧信息 int Distance; ArcCell *info;//此项用来保存弧信息,,在本实验中没有相关信息要保存 }ArcCell,AdjMatrix[ MAX_VERTEX_NUM][ MAX_VERTEX_NUM]; typedef struct{//储存顶点信息 string vexs[ MAX_VERTEX_NUM];//顶点向量

AdjMatrix arcs;//邻接矩阵 int vexnum , arcnum;//图的当前顶点数和弧数 }MGraph; 顶点信息和弧信息都是用来建立一个有向网G 2) d[v][w];//G中各对顶点的带权长度 若P[v][w][u]为TRUE,则u是从v到w当前求得最短路径上的顶点 4.2主要的实现思路 首先通过一个函数(CreateDN)建立图的邻接矩阵储存方式,一次输入某条弧的起点,终点,和权值。通过调用Locate函数来找到该弧在邻接矩阵中的相应位置。 其次运用弗洛伊德算法来求各定点的最短路劲,具体思路为:如果从v到w有弧,则存在一条长度为arcs[v][w]的路径,该路径不一定是最短路径。考虑路径(v,u,w)是否存在,若存在,比较(v,w)和(v,u,w)的长度,取较短者为从v到w的中间点序号不大于0的最短路径。以此类推,每次增加一个点,从而求出任意两点间的最短路径。这样,经过n次比较后,所求得的必为从v到w的最短路径。按此方法,可以同时求得任意两点间的最短路径。 五、主要源程序代码(包含程序备注) #include #include using namespace std; #define INfinity 10000//最大值 # define MAX_VERTEX_NUM 10//最大顶点数 typedef struct ArcCell{//储存弧信息 int Distance; ArcCell *info; }ArcCell,AdjMatrix[ MAX_VERTEX_NUM][ MAX_VERTEX_NUM]; typedef struct{//储存顶点信息 string vexs[ MAX_VERTEX_NUM];//顶点向量 AdjMatrix arcs;//邻接矩阵 int vexnum , arcnum;//图的当前顶点数和弧数 }MGraph; int Locate(MGraph &G,string v) { int a=0; for (int i=0;i

数据结构课程设计关键路径

数据结构课程设计-关键路径 #define max 20 #include #include #include using namespace std; typedef struct ArcNode//定义表结点 {int adjvex;//该弧所指向顶点的位置 struct ArcNode *nextarc;//指向下一条弧的指针 int info;//该弧的权值 }ArcNode; typedef struct VNode//定义头结点 {int data;//顶点信息 ArcNode *firstarc;//指向第一条依附该顶点的弧的指针}VNode,AdjList[max]; typedef struct//定义ALGraph {AdjList vertices; int vexnum,arcnum;//图的当前顶点数和弧数 int kind;//图的种类标志 }ALGraph; typedef struct//定义栈 {int *base;//栈底 int *top;//栈顶

}stack; void initstack(stack &s)//建立空栈{s.base=(int*)malloc(max*sizeof(int)); s.top=s.base; } int stackempty(stack s)//判断是否为空栈{if(s.base==s.top) return 1; else return 0; } int stackfull(stack s)//判断是否为满栈{if(s.top-s.base>=max) return 1; else return 0; } int pop(stack &s)//进行出栈 {int e;//出栈先进行赋值,后移动指针if(!stackempty(s)) {e=*(s.top-1); s.top--; return e; } else return NULL; }

最短路径算法实验报告

东华大学计算机学院离散数学 实验五:最短路径 实验所属系列:离散数学课后实验 实验对象:本科 相关课程及专业:离散数学,计算机专业 实验类型:课后实验 实验时数(学分):4学时 实验目的 学习图的最短路径算法的实现。 实验内容与要求 根据输入的图形(实验四),输入起点和终点,求出最短路径和最短路径的长度。 实验的软硬件环境 PC机一台,装有VC++6.0或其它C语言集成开发环境。 实验准备 熟悉最短路径算法。 实验步骤 1.编写一段代码,接收键盘的输入定点的数量,并以输入的整数对作为边来建立图形的邻接矩阵(无向权重图)。 例如:5,6,12 表示定点5和定点6间有边,边的权重为12。 2 打印出邻接矩阵。 3.输入起点和终点。 4、打印最短路径和最短路径的长

#include #define BIG 9999 void dijkstra(int cost[][6],int n,int st,int distance[]) { int s[6]; int mindis,dis; int i,j,u; for(i=0;i

相关文档
最新文档