最短路径:拯救007 课程设计报告

最短路径:拯救007 课程设计报告
最短路径:拯救007 课程设计报告

《数据结构课程设计》报告

题目:最短路径—拯救007问题

专业 计算机科学与技术

学生姓名 丁亚敏

班级 B 计算机115

学号 1110704503

指导教师 巩永旺

完成日期

2013年1月11日

目录

1简介 (3)

2算法说明 (3)

3测试结果 (6)

4分析与探讨 (9)

5小结 (9)

参考文献 (12)

附录.................................................................................... 错误!未定义书签。

一、简介

最短路径是,在一个图中,若从一个顶点到另一个顶点存在着一条路径(这里只讨论无回路的简单路径),则称该条路径长度为为该路径上所有经过的边的数目,它也等于该路径上的顶点数减1。由于从一个顶点到另一个顶点可能存在着多条路径,在每条路径上所经过的边数可能不同,把路径长度最短(经过的边数最少)的那条路径叫做最短路径,其路径长度叫做最短距离。这是对无权图而言的,若图是帯权图,则把从一个顶点vi到vj的一条路径上所有经过边的权值之和定义为该路径的带权路径长度。把带权路径长度最短的那条路径称为该有权图的最短路径,其路径长度称为最短距离。

Dijksra算法:如何求解从一个顶点到其余每个顶点的最短路径呢?狄克斯特拉于1959年提出了解决此问题的一种按路径长度的递增次序产生最短路径的算法。基本思想是,从图中给定源点到其他各个顶点之间客观上应个存在一条最短路径,在这组最短路径中,按其长度的递增次序求出到不同顶点的最短路径和路径长度。

图是一种较线性结构和树形结构更为复杂的非线性数据结构,这种复杂性主要来自数据元素之间的复杂关系。在图结构中,任何两个数据元素之间都可能存在关系,一般用顶点表示数据元素,而用顶点之间的连线表示数据元素之间的关系。图的二元组定义为:G=(V,E)。其中V是非空的顶点集合,E是V上的二元关系集合。

题目内容:

看过007系列的电影的人们一定很熟悉Jams Bond这个世界上最著名的特工了。在电影“Live And Let Die”中Jams Bond被一组毒品贩子抓住并且关到湖中心的一个小岛上,而湖中有很多凶猛的鳄鱼。这时Jams Bond做出了一个最惊心动魄的事情来逃脱——他跳到了最近的鳄鱼的头上,在鳄鱼还没有反映过来的时候,他有跳到另一支鳄鱼的头上.。。。。。。最后他终于安全地跳到了湖岸上。

假设湖是100*100的正方形,设湖的中心在(0,0),湖的东北角的坐标是(50,50)。湖中心的圆环小岛的圆心在(0,0),直径是15.。一些凶残的鳄鱼分布在湖中不同的位置。现已知的湖中的鳄鱼的位置和Jams Bond可以跳的最大距离,请你告诉Jams Bondyitiao 最短的到达湖边的路径。他逃出去的路径长度等于他跳的次数。

二、算法说明

程序从“input.txt”文件中读取输入信息,这个文件包含了多组输入数据。

每组输入数据的起始行中包含了两个整数n和d,n是鳄鱼的数量而且n<=100,d是007可以跳的最大距离而且d>0。起始行下面的每一行是鳄鱼的坐标(x,y),其中x,y都是整数,而且没有任何两只鳄鱼出现在同一位置。Input.txt文件以一个负数结尾。

输出要求:

程序结果输出到output.txt文件中。对于每组输入数据,如果007可以逃脱,则输出到output.txt文件的内容格式如下:第一行是007必须跳的最小步数,然后按照跳出顺序记录跳出路径上的鳄鱼坐标(x,y),每行一个坐标。如果007不可能跳出去,则将-1写入文件。如果这里有很多个最短路径,只需输入其中的任意一种。

输入例子:

410 /*第一组输入数据*/

17 0

27 0

37 0

45 0

1 10 /*第二组输入数据*/

20 30

-1

输出例子:

5 /*对应第一组数据的输出*/

17 0

27 0

45 0

-1 /*对应第二组数据的输出*/

提示:将每个鳄鱼看作图中的每一个顶点。如果007可以从A点跳到B点,则A和B之间就有一条边。

主要数据结构与算法:

为了记录007跳过的路径,可定义为如下结构:

typedef unsigned int Vertez;

typedef double Distance;

typedef struct GraphNodeRecord{

int X; /*x轴坐标*/

int Y; /*y轴坐标*/

unsigned int Step; /*记录到本节点一共跳了多少步*/

Vertex Path; /*指向本节点的父节点,即跳到本节点之间007所在节点*/ }GraphNode;

typedef GraphNode*Grapha;

寻找跳出路径的算法:

/*读出一组测试数据返回007跳过的路径Graph,*Bank记录最短到达湖岸的路径。该算法实际上是应用队列对图惊醒广度搜索,以寻找到岸边的最短路径,其中入队列与出队列函数分别是Inject()和Pop()*/

Graph read_case(FILE * InFile,int num,Vertex* Bank,Deque D)

{

Graph G=NULL;

Distance JamesJump;

Vertex V;

int x,y;

int i,Times;

*Bank = 0; /*初始化跳出的路径的记录*/

fscanf(Infile,”%lf”,&JamesJump);/*读取步长*/

if(Bond can jumo to the bank directly)

{

*Bank=1; /*直接跳出的情况*/

}

else if (num>0) /*007必须经过鳄鱼头上的情况*/

{

num+=2;

G=GraphNew”(num);

for(i=2;i

{

if(Bond can jump to G[i] from island) /*判断是否能从岛上跳上

该点*/ {

G[i].Path=1;

G[i].Step=1; /*一步*/

if(Bond can jump to bankfrom G[i]) /*判断该点是否能跳出*/

{

*Bank =i; /*007可以跳出,记录该点*/

Skip other crocodile

break;

}

else

Inject(i,D);/*插入该点,并开始下一个检测*/

}

}

while(!IsEmpty(D)) /*只经过一只鳄鱼无法跳出,必须还要跳到其他鳄鱼的

情况*/

{

V=Pop(D);

for(i=2;i

{

if(bond can jump from v to i,and step of i>step of v+1)

{

G[i].Path=V;

G[i].Step= G[V].Step+1;/*把i点练到v点后面*/

if(bond can jump from ito bank and the path is shorter than others)

*Bank=i;

else

Inject(i,D);

}

}

}

}

return G;

}

在执行完算法read_case后,*Bank值可能如下3种可能:

(1)0,意味着007无法逃脱出去;

(2)1,意味着007可以直接从岛上跳出去,而不用经过鳄鱼的脑袋;

(3)k,返回的第k点是007经过最短路径逃出鳄鱼潭是经过的最后一个顶点。可以根据G[k]的path参数来追踪该点的上一点,由此类推可以得到007逃脱的最短路径。

三、测试结果

对于本程序,需要应用各种类型的测试用例来进行测试。一般来说,可以设计一下几种类型的测试用例。

?007步长很大,以至于可以直接跳出,例如:

043

- 1

?007不可能逃出去的情况(根本就没有鳄鱼),例如:

0 1

- 1

?一般情况的例子,例如:

4 10

17 0

27 0

37 0

45 0

1 10

20 30

- 1

?最短路径有多条,只需要输出任意一种即可,例如:

25 10

8 8

9 9

10 10

11 11

12 12

13 13

14 14

15 15

16 16

18 18

20 20

23 23

25 25

27 27

28 28

31 31

33 33

35 35

38 38

41 41

44 44

46 46

47 47

49 49

输出结果:

7

9 9

16 16

23 23

28 28

35 35

41 41

?input.txt文件中,名称不正确、空文件、缺少部分输入等不规范情况,例如:

5 10

10 10

-25 30

30 30

注:缺少鳄鱼点(应有5个鳄鱼点)和文件结尾符(-1)。

运行结果:

输入数据:

0 43

0 1

4 10

17 0

27 0

37 0

45 0

1 10

20 30

25 10

8 8

9 9

10 10

11 11

12 12

13 13

14 14

15 15

16 16

20 20

23 23

25 25

27 27

28 28

29 29

31 31

33 33

35 35

38 38

41 41

44 44

46 46

47 47

49 49

10 20

10 10

20 20

10 30 输出结果

1

-1

5

17 0

27 0

37 0

45 0

-1

7

9 9

16 16

23 23

28 28

35 35

41 41

3

10 10

10 30

3

-10 -10

-10 -30

3

-10 -10

3

10 10

30 10

3

10 10

10 30

-1

7

10 10

10 15

20 15

22 22

31 20

40 20

-1

7

-10 -8

-15 -15

四、分析与探讨

1.明确题目中的已知条件

(1)007被关的小岛在湖的中心;

(2)小岛是圆形,圆心在(0,0),而且直径是15;

(3)没有两只鳄鱼在同一个位置;

(4)鳄鱼的坐标值都是整数。

2.一些判断007是否能跳出的细节

(1)判断007是否能够直接从岛上跳到湖岸:由已知条件可得,湖是一个正方形,边长为100,中心是在(0,0),四个顶点分别是(50,50),(50,-50),(-50,-50),(-50,50)。而湖中小岛的直径是15.所以如果007可以跳大于等于(50-15/2)=42.5,他就可以直接从小岛跳到湖岸,而不用经过鳄鱼。

(2)判断007是否能够直接从岛上跳到湖中点A:已知半径是7.5,假设点A的坐标是(x,y),007的步长是L,则当点A到中心(0,0)的距离小于等于007的步长加上小岛的半径7.5的时候就能确定007可以从岛上跳到点A,即:x*x+y*y<=(L+7.5)*(L+7.5)。

(3)判断007是否能够从点A跳到点B:假设007的步长是L所以如果两点之间的距离小于等于L,则判断007可以从A跳到B,即(A.x-B.x)^2+(A.y-B.y)^2<=L*L;其他情况时007不能从A点跳到B点。

(4)判断007是否能够从点A跳到湖岸:当从A点到湖岸的距离小于等于007的步长的时候,说明他可以从A点跳到湖岸,|A.x|+L>=50或|A.y|+L>=50;其他情况时007不能从A点跳到湖岸。

五、小结

经历了这次课程设计实践,我感触颇深。此前一直错误的以为做课程设计其实是件很简单的事情,根本不需要兴师动众而且花费那么长的时间,两三天足矣。在此错误认识的引导下,也就没怎么把它当回事,只打算随随便便应付一下,完工交

差。但是等到真正亲历后才发现原来自己是多么的愚蠢可笑,自己的想法又是多么的幼稚、荒谬。

做的过程并不顺利,而其中的种种遭遇更是让我反省良久。一路坚持下来,其中的艰辛也许只有经历过才能真正体会。不过,经过一番实践后,当看到自己亲手做的东西就那么真实的摆在眼前,曾经的心血与付出终于有了回报,那份激动与喜悦的心情又岂是三言两语说得清楚的!“如人饮水,冷暖自知”,现在我是真的体会到了。

总的来说,我觉得这次设计实践收获颇丰,于今后的学业、步入社会后参加工作乃至做人做事都是一笔不小的财富!通过这次课程设计,我懂得了实践的重要性、团队合作精神的可贵以及做事前的充足准备与做事过程中的坚持和细心谨慎对于高质高效地完成一项工作的特殊意义。任何事情都有一个循序渐进的过程,知难而进、勇往直前,只有这样才有可能领略险峰的无限风光。治学、做人又何尝不是如此呢?

先说实践。关于实践,前人曾留有十二字箴言:“实践是检验真理的唯一标准”,经过这次课程设计,我所理解的实践已远不只此。人说“爱过才知情深,醉过方知酒浓”,我以为,只有实践才会出真知,没有实践,任何理论、见解都是苍白无力的。眼之所见、心之所想大多数时候并不就是手之所为。在动手尝试之前,我可以算是一个眼高手低的人。课程设计的题目下来了,共有三个可供选择。相较之下我选了做“拯救007”,本以为这是最简单的,基本上可以不费多大心力即轻松搞定。因此开始的几天里也没怎么刻意着手这件事情。事实却是,等到我真正做了才发现随着问题的不断出现和为此而查阅许多相关的资料,花了那么多的时间与精力,做的过程还是如此的困难重重,并且做出来的东西也并非尽善尽美。方知许多事情并非都如人所想,不实践、不参与是无论如何也不会明白的。实践之重要正在于此!这段小小的经历使我感触很深,也教会我在以后的学习与工作中不要再眼高手低,任何事情都需亲自尝试后再做定断。牢记“眼之所见、心之所想非手之所为也!”

接下来再说着手前的准备。三国时诸葛亮草船借箭有赖“万事俱备,只欠东风”,而我的设计能顺利进行也必须有充足的准备作为后盾。只可惜在一开始的时候由于并不很重视因此也未意识到这一点,导致做的过程中停停找找、找找停停,严重影响了设计进度和效率,并且这种临阵磨枪式的做法也使得准备很不充分,往往是急需要用的东西找也找不到,如某控件类的方法如何使用、其原型或者参数的类型与意义为何等等。这样一来,自然会遇到重重困难。我想,如果在动手之前已经做好了充足准备,必然会少遇到很多麻烦,也不会一度出现举步维艰的情况。当然了,这次还只是一个小小的设计,如果换成是某个大型系统的设计岂不是无法想象?所以这次经历也算是给了我一个教训:千万不要打无准备的仗!早准备方保无虞。

说到了准备,也得说说做事过程中的坚持与细心谨慎。很难想象如果没有坚持到底的勇气和不懈的努力,当一个人面对困难时能迎难而上并一路坚持走下来。当初我选定这个设计课题时正是考虑到它简单、易完成(当然事实并非如此),不过后来做的时候不断出现新的问题,而且有些还是从理论上无法解释的,这时我就在想算了吧,这么难搞,还是换别的做。正好其他同学做的在网上找到了很多原本的版本,因而做起来就不费吹灰之力。当时几乎就在一念之间转了方向,好在随后终于做成功了一部分功能。这点小小的成功让我体会到了自己动手的乐趣与成功后的喜悦,在此激励之下,幸而坚持了下来。回味其中的艰辛,尽享成功的喜悦,纵是雏鹰试翼之作,毕竟自己所为,比之其他同学照搬别人的代码以完成任务却不知到底做了什么、又有什么收获,不是更有意义吗?能够坚持即已成功一半。世上无难

事,唯恐少坚持!

此外,在做的过程中不可能是一帆风顺的,必然免不了频繁出错。这一方面是由于输入时的粗心大意造成的,另一方面则是编写的代码本身的问题。对于前者,如果能在操作时做到细心谨慎,当然可以避免。即便免不了输入错误,在调试的过程中也应细心谨慎,惟其如此,方可免去许多麻烦,保证软件设计的质量与效率。由于要不断的调试,而VC6.0对于用户所作的改动会自动保存,因此就可能出现保存了修改后错误的结果,反而将前面做好的调试无误的内容覆盖掉的情况。如果没有时时保持细心谨慎的态度,及时对调试无误的结果加以保存,将可能遭遇前

功尽弃的“灭顶之灾”。不管怎样,时时处处细心谨慎,方保顺利无虞。我想,无论是治学还是工作或是为人,这

样的一种态度都是至关重要的。

由于是初次设计,仅凭自己一人之力是很难完成的,所以大家或借助于网络,或借助于参考书籍、期刊资料等。我也不例外,和几位同学一起研究设计方案及具体实现方法,并跑了好几趟图书馆,查资料,抄笔记,上网搜索资料,终于在大家的通力合作之下完成了这个项目。一起做的过程大家朝着一个共同的目标努力,分工协作,互相交流,提出不同的想法,不断完善,不断进步,一个一个的问题迎刃而解,一个一个的功能不断做出来。最后,集体的劳动终于换来了丰硕的成果(尽管并不完美)。这次经历使我懂得了团队合作精神的可贵。不仅如此,我觉得这次合作的过程真的是很愉快,很让人回味和怀念!我想将来参加工作后这种合作还会有,参与合作,倡导这种合作精神是很可贵和重要的。社会的进步使得人们面临的问题越来越复杂,迫使人们寻求集体的智慧、团队的力量来解决它们。个人的力量终究是有限的,也不可能独立完成所有的事情,每个人都有义务和必要学会与别人沟通、交流,学会合作,参与合作,在合作的过程中培养这样一种意识。对于将来的工作,这也是有重要意义的。

最后,值得一提的是编辑这份电子文稿,也使我学会了使用更多的Word功能。虽然不是本次设计的正题,但毕竟也算是一种收获吧。能够多学一点知识,总算也是一种成就。

课程设计即将结束,一个个挑灯夜战、激烈讨论的夜晚也已过去。回顾整个过程,更清楚的认识到知识的欠缺,而自己所学的VC++知识只能算是皮毛,还有更多的东西需要我去研究,去掌握。尽管如此,我也不会退缩、停滞不前,因为通过这次设计实践,我已初识VC++的庐山真面目。这才是最重要的。相信经过此次课程设计,日后将会有所改进。此外,我还要感谢所有帮助过我的老师、同学,感谢你们在这几天里给我的帮助与鼓励。正是因为你们的帮助与鼓励,我才能很好的完成这一次的课程设计,才能学到这么多的知识;也正是因为你们的帮助与鼓励,我真正认识到了团队力量的伟大,“团结就是力量。”感谢你们,谢谢。

参考文献

[1] 刘振安,刘燕君.C程序设计课程设计[M].[北京]机械工业出版社,2004年9月

[2] 谭浩强.C程序设计(第三版).清华大学出版社,2005年7月

[3] 严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社,1997年4月

[4] 李志球《实用C语言程序设计教程》北京:电子工业出版社,1999

[5] 王立柱:C/C++与数据结构北京:清华大学出版社,2002

[6] 吴文虎《程序设计基础》北京:清华大学出版社,2003

[7] 郭福顺,王晓芬,李莲治《数据结构》(修订本),大连理工大学出版社,

1997

[8] 潘道才,陈一华《数据结构》,电子科技大学出版社,1994

源代码

本程序包含3个头文件和4个C源程序文件,分别是:Graph.h Graph.c Deque.h Deque.c error.h error.c main.c

1.Graph.h

#ifndef _GRAPH_H_

#define _GRAPH_H_

#define ISLAND_DIAMETER 15 /* 小岛的直径*/

#define LAKE_BOUNDARY_X 50 /* 小岛到湖边的距离,在x轴上*/

#define LAKE_BOUNDARY_Y 50 /* 小岛到湖边的距离,在y轴上*/

#define INFINITY 10000 /* 可以跳的步数的最大值*/

typedef unsigned int Vertex;

typedef double Distance;

typedef struct GraphNodeRecord{

int X; /* x轴坐标*/

int Y; /* y轴坐标*/

unsigned int Step; /*跳至该点的步数*/

Vertex Path; /*记录上一个点*/

} GraphNode;

typedef GraphNode *Graph;

Graph GraphNew(int NodeNum);

void GraphDelete(Graph G);

/* 判断007是否能从起始处跳至该点(x, y) */

int CheckForStart(int x, int y, Distance d);

/* 判断007是否能从该点跳至河岸*/

int CheckForEnd(int x, int y, Distance d);

/* 判断007是否能从点i跳至点j */

int CheckForConnect(Graph g, Vertex i, Vertex j, Distance d);

#endif

2.Graph.c

#include "Graph.h"

#include "error.h"

#include

/******创建新的Graph******/

Graph GraphNew(int NodeNum)

{

Graph G;

if(NodeNum <= 0)return NULL;

G = malloc(NodeNum * sizeof(GraphNode)); /* 分配空间*/

CHECK(G);

for(i = 0; i < NodeNum; i++) /* 初始化*/

{

G[i].X = 0;

G[i].Y = 0;

G[i].Step = INFINITY;

G[i].Path = 0;

}

return G;

}

/******删除一个Graph)******/

void GraphDelete(Graph G)

{

if(G)free(G);

}

/*******判断007是否能从起始处跳至该点(x, y),步长是d******/

int CheckForStart(int x, int y, Distance d)

{

double t;

t = (ISLAND_DIAMETER + (d * 2.0));

return (x*x + y*y) <= t*t/4.0;

/* x^2 + y^2 <= (ISLAND_DIAMETER/2.0 + d)^2 */

}

/*******判断007是否能从该点跳至河岸,步长是d******/

int CheckForEnd(int x, int y, Distance d)

{

if(x < 0)x = -x; /* 取x的绝对值*/

if(y < 0)y = -y; /* 取y的绝对值*/

return (d >= LAKE_BOUNDARY_X - x) /* 由于湖是个正方形,只需检查这两个距离*/ || (d >= LAKE_BOUNDARY_Y - y);

}

/*******判断007是否能从点i跳至点j,步长是d******/

int CheckForConnect(Graph g, Vertex i, Vertex j, Distance d)

{

int x, y;

x = g[i].X - g[j].X;

y = g[i].Y - g[j].Y;

return x*x + y*y <= d*d;

}

3.Deque.h

#ifndef _DEQUE_H_

#define _DEQUE_H_

typedef unsigned int ElemType; /* 在本程序中ElemType指定为int */

/* 链表形式*/

typedef struct NodeRecord{

ElemType Element;

struct NodeRecord *Next; /* 指向下一个node */

} *Node;

typedef struct DequeRecord{

Node Front, Rear; /* 分别指向Deque的前后两个点*/

} *Deque;

Deque DequeNew();

void DequeDelete(Deque D);

void DequeClear(Deque D);

int IsEmpty(Deque D);

void Push(ElemType X, Deque D);

ElemType Pop(Deque D);

void Inject(ElemType X, Deque D);

#endif

4.Deque.c

#include "Deque.h"

#include "error.h"

#include

/******创建新的Deque******/

Deque DequeNew()

{

Deque D;

D = malloc(sizeof(struct DequeRecord));

CHECK(D);

D->Front = D->Rear = malloc(sizeof(struct NodeRecord)); /* 空的头*/

CHECK(D->Front);

D->Front->Element = 0; /* 初始化*/ D->Rear->Next = NULL;

return D;

}

/******删除Deque******/

void DequeDelete(Deque D)

if(D)

{

while(D->Front)

{

D->Rear = D->Front->Next;

free(D->Front);

D->Front = D->Rear;

}

free(D);

}

}

/******DequeClear删除所有的节点除了头节点******/

void DequeClear(Deque D)

{

if(D)

{

while(D->Front->Next) /* 删除第一个节点*/

{

D->Rear = D->Front->Next->Next;

free(D->Front->Next);

D->Front->Next = D->Rear;

}

D->Rear = D->Front;

}

}

/******判断Deque是否为空******/

int IsEmpty(Deque D)

{

return D->Front == D->Rear;

}

/******将X元素压占到D中******/

void Push(ElemType X, Deque D)

{

Node NewNode;

NewNode = malloc(sizeof(struct NodeRecord)); /* 建立新的节点*/ CHECK(NewNode);

NewNode->Element = X;

NewNode->Next = D->Front->Next;

if(D->Front == D->Rear) /* 如果D为空*/ D->Rear = NewNode;

D->Front->Next = NewNode; /* 压栈*/

/******将第一个元素出栈******/

ElemType Pop(Deque D)

{

Node Temp;

ElemType Item;

if(D->Front == D->Rear)

{

Error("Deque is empty");

return 0;

}

else

{

Temp = D->Front->Next; /* 得到第一个元素*/

D->Front->Next = Temp->Next; /* 重置第一个元素*/

if(Temp == D->Rear) /* 如果只有一个元素*/

D->Rear = D->Front; /* 将D置空*/

Item = Temp->Element;

free(Temp);

return Item;

}

}

/******插入元素X至D末尾******/

void Inject(ElemType X, Deque D)

{

Node NewNode;

NewNode = malloc(sizeof(struct NodeRecord)); /* 创建新节点*/ CHECK(NewNode);

NewNode->Element = X;

NewNode->Next = NULL;

D->Rear->Next = NewNode;

D->Rear = NewNode;

}

5.error.h

# ifndef ___DS_PROJ_2_ERROR_H___

# define ___DS_PROJ_2_ERROR_H___

#define CHECK(X) if(NULL == (X))Error("Out of space!!!")

void Error(const char *msg);

void Warning(const char *msg);

#endif

6.error.c

#include "error.h"

#include

#include

/******打印错误信息,并退出程序******/

void Error(const char *msg)

{

if(NULL != msg)

fprintf(stderr,"%s\n",msg);

exit(-1);

}

/******打印警告信息,但并不退出程序******/

void Warning(const char *msg)

{

if(NULL != msg)

fprintf(stderr,"%s\n",msg);

}

7.main.c

#include "Graph.h"

#include "Deque.h"

#include "error.h"

#include

#include

/******读入一个case返回一个Graph,*Bank 记录最短到达河岸的路径******/ Graph read_case(FILE *InFile, int num, Vertex* Bank, Deque D)

{

Graph G = NULL;

Distance JamesJump;

Vertex V;

int x, y;

int i, Times;

*Bank = 0;

fscanf(InFile, "%lf", &JamesJump);

if(CheckForEnd(0, 0, JamesJump + ISLAND_DIAMETER/2.0))

{

for(i = 0; i < (num << 1); i++) /*一步便跳出的情况*/

fscanf(InFile, "%d", &x);

*Bank = 1;

}

else if(num > 0) /* 007必须经过鳄鱼头上的情况*/

{

num += 2;

G = GraphNew(num);

for(i = 2; i < num; i++) /* 第三个node开始是鳄鱼*/

{

fscanf(InFile, "%d", &x);

fscanf(InFile, "%d", &y);

G[i].X = x;

G[i].Y = y;

if(CheckForStart(x, y, JamesJump)) /*判断是否能跳上该点*/

{

G[i].Path = 1; /*007可以跳到*/

G[i].Step = 1; /* 一步*/

if(CheckForEnd(x, y, JamesJump)) /* 判断该点是否能跳出*/

{

*Bank = i; /* 007可以跳出*/

Times = (num - i - 1) << 1;

for(i = 0; i < Times; i++) /* 不必检验其他鳄鱼*/

fscanf(InFile, "%d", &y);

DequeClear(D);

break;

}

else

Inject(i, D); /* 插入该点,并开始下一个检测*/ }

}

while(!IsEmpty(D)) /*只经过一个鳄鱼无法跳出,必须还要跳到其它鳄鱼的情况*/

{

V = Pop(D);

for(i = 2; i < num; i++) /* 从这只鳄鱼跳到其他各个鳄鱼*/

{

if((G[i].Step > G[V].Step + 1)

&& CheckForConnect(G, V, i, JamesJump))

{

G[i].Path = V;

G[i].Step = G[V].Step + 1;

if((G[i].Step < G[*Bank].Step)

&& CheckForEnd(G[i].X, G[i].Y, JamesJump))

*Bank = i;

else

Inject(i, D);

}

}

}

}

return G;

}

/******写出结果,即最短路径******/

void write_result(FILE *OutFile, Vertex Bank, Graph G, Deque D) {

unsigned int Times, i;

Vertex V;

switch(Bank){

case 0: /* 007无法跳出*/

fprintf(OutFile, "%d\n", -1);

break;

case 1: /* 007可以直接跳出*/

fprintf(OutFile, "%d\n", 1);

break;

default:

Times = G[Bank].Step + 1; /* 跳的步数*/

while(Bank != 1) /* 跟踪路径*/

{

Push(Bank, D);

Bank = G[Bank].Path;

}

fprintf(OutFile, "%d\n", Times); /* 输出*/

for(i = 1; i < Times; i++)

{

V = Pop(D);

fprintf(OutFile, "%d ", G[V].X);

fprintf(OutFile, "%d\n", G[V].Y);

}

}

}

int main(int argc, char *argv[])

{

FILE *in, *out;

Deque D;

int VertexNum;

Graph G = NULL;

Vertex Bank = 0;

in = fopen("input.txt", "r");

if(NULL == in)

{

实验报告

算法与数据结构 实验报告 系(院):计算机科学学院 专业班级:软工11102 姓名:潘香杰 学号: 201104449 班级序号: 18 指导教师:詹泽梅老师 实验时间:2013.6.17 - 2013.6.29 实验地点:4号楼5楼机房

目录 1、课程设计目的...................................... 2、设计任务.......................................... 3、设计方案.......................................... 4、实现过程.......................................... 5、测试.............................................. 6、使用说明.......................................... 7、难点与收获........................................ 8、实现代码.......................................... 9、可改进的地方.....................................

算法与数据结构课程设计是在学完数据结构课程之后的实践教学环节。本实践教学是培养学生数据抽象能力,进行复杂程序设计的训练过程。要求学生能对所涉及问题选择合适的数据结构、存储结构及算法,并编写出结构清楚且正确易读的程序,提高程序设计基本技能和技巧。 一.设计目的 1.提高数据抽象能力。根据实际问题,能利用数据结构理论课中所学到的知识选择合适的逻辑结构以及存储结构,并设计出有效解决问题的算法。 2.提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。 3.初步了解开发过程中问题分析、整体设计、程序编码、测试等基本方法和技能。二.设计任务 设计一个基于DOS菜单的应用程序。要利用多级菜单实现各种功能。内容如下: ①创建无向图的邻接表 ②无向图的深度优先遍历 ③无向创建无向图的邻接矩阵 ④无向图的基本操作及应用 ⑤图的广度优先遍历 1.有向图的基本操作及应用 ①创建有向图的邻接矩阵 ②创建有向图的邻接表 ③拓扑排序 2.无向网的基本操作及应用 ①创建无向网的邻接矩阵 ②创建无向网的邻接表 ③求最小生成树 3.有向网的基本操作及应用 ①创建有向网的邻接矩阵 ②创建有向网的邻接表 ③关键路径 ④单源最短路径 三.设计方案 第一步:根据设计任务,设计DOS菜单,菜单运行成果如图所示:

课程设计报告模板)

课程设计报告模板()

————————————————————————————————作者: ————————————————————————————————日期: ?

课程设计(论文)任务书 软件学院软件+电商专业09级(2)班 一、课程设计(论文)题目基本模型机设计与实现 二、课程设计(论文)工作自2011年6月 20 日起至2011年 6月 24日止。 三、课程设计(论文) 地点:计算机组成原理实验室(5#301) 四、课程设计(论文)内容要求: 1.课程设计的目的 通过课程设计的综合训练,在掌握部件单元电路实验的基础上,进一步掌握整机 概念。培养学生实际分析问题、解决问题和动手能力,最终目标是想通过课程设计的形式,帮助学生系统掌握该门课程的主要内容,更好地完成教学任务。 2.课程设计的任务及要求 1)基本要求? (1)课程设计前必须根据课程设计题目认真查阅资料; (2)实验前准备好实验程序及调试时所需的输入数据; (3)实验独立认真完成; (4)对实验结果认真记录,并进行总结和讨论。 2)课程设计论文编写要求 (1)按照书稿的规格撰写打印课设论文 (2)论文包括目录、绪论、正文、小结、参考文献、附录等 (3)正文中要有问题描述、实验原理、设计思路、实验步骤、调试过程与遇到问题的解决方法、总结和讨论等 (4)课设论文装订按学校的统一要求完成 3)课设考核 从以下几方面来考查:

(1)出勤情况和课设态度; (2)设计思路; (3)代码实现; (4)动手调试能力; (5)论文的层次性、条理性、格式的规范性。 4)参考文献 [1]王爱英.计算机组成与结构[M]. 北京:清华大学出版社, 2007. [2] 王爱英. 计算机组成与结构习题详解与实验指导[M]. 北京:清华大学出版社, 2007. 5)课程设计进度安排 内容天数地点 构思及收集资料1图书馆 实验与调试 3 实验室 撰写论文 1 图书馆 6)任务及具体要求 设计实现一个简单的模型机,该模型机包含若干条简单的计算机指令,其中至少包括输入、输出指令,存储器读写指令,寄存器访问指令,运算指令,程序控制指令。学生须根据要求自行设计出这些机器指令对应的微指令代码,并将其存放于控制存储器,并利用机器指令设计一段简单机器指令程序。将实验设备通过串口连接计算机,通过联机软件将机器指令程序和编写的微指令程序存入主存中,并运行此段程序,通过联机软件显示和观察该段程序的运行,验证编写的指令和微指令的执行情况是否符 合设计要求,并对程序运行结果的正、误分析其原因。 学生签名: 亲笔签名 2011年6月20 日 课程设计(论文)评审意见 (1)设计思路:优( )、良()、中( )、一般()、差( ); (2)代码实现:优()、良()、中()、一般()、差();

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

一、课程设计题目:校园最短路径问题 二、课程设计目的: 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) 当用户操作错误时,系统会出现出错提示。 五、概要设计:

甘特图实验报告doc

甘特图实验报告 篇一:Project实验报告 Project实验报告 朱曦朦 学号:XX306202412信管1001 实验目的: 通过做出一个标准的实验,了解project的基本运用方法和实验步骤,掌握设定项目的开始日期的基本方法。完成资源的优化配置,实现资源的充分利用。并对工期做一个初步的调整, 提高估计工期的精确度,掌握PERT的方法,实现整个过程(本文来自:https://www.360docs.net/doc/b5698033.html, 小草范文网:甘特图实验报告)的最优配置。对甘特图,关键路径等基本定义有一个初步的了解,初步学习到PROJECT的基本内容。 一;定义起始时间: 在定义项目中进行时间的确认: 一直保存至第三步,进行初始化的设定。 二复制新产品模板. 三调整资源的最大单位 修改资源“产品工程设计”的最大单位为200%,并增加资源“生产线”(工时资源,100%,用于完成生产任务,原来工程师需要5小时完成的任务,生产线只要1小时就能完

成,但必须同时配1名产品工程设计进行监控)。 通过视图进入资源工作表,将“产品工程设计”的最大单位改为 200% 在甘特图中未找到工程师,所以未对其进行修改。 三.为了提高估计工期的精确度,采用PERT技术规划项目工期(选取2到3个任务进行规划)。 设置PERT权重 设置后观察得到PERT项工作表。 选取2,3个项目后确定乐观工期,预期工期,悲观工期,通过计算PERT得出结论。 四.分析项目工期由哪些任务决定,确定压缩工期的方法。通过格式中的甘特图向导,对关键路径进行确认,从而得到确定项目工期的任务,由红线显示。编号为2,3,5,6,8,9,10, 11 对项目进行优化,可以通过2种路径,一是调整关键路径的工期,将其缩短。二是删除原有的链接关系,将后面的工期开始时间提前,如下图所示。 篇二:MS Project 上机实验报告 MS Project 上机实验报告 一、工程概况

课程设计报告【模板】

模拟电子技术课程设计报告设计题目:直流稳压电源设计 专业电子信息科学与技术 班级电信092 学号 200916022230 学生姓名夏惜 指导教师王瑞 设计时间2010-2011学年上学期 教师评分 2010年月日

昆明理工大学津桥学院模拟电子技术课程设计 目录 1.概述 (2) 1.1直流稳压电源设计目的 (2) 1.2课程设计的组成部分 (2) 2.直流稳压电源设计的内容 (4) 2.1变压电路设计 (4) 2.2整流电路设计 (4) 2.3滤波电路设计 (8) 2.4稳压电路设计 (9) 2.5总电路设计 (10) 3.总结 (12) 3.1所遇到的问题,你是怎样解决这些问题的12 3.3体会收获及建议 (12) 3.4参考资料(书、论文、网络资料) (13) 4.教师评语 (13) 5.成绩 (13)

昆明理工大学津桥学院模拟电子技术课程设计 1.概述 电源是各种电子、电器设备工作的动力,是自动化不可或缺的组成部分,直流稳压电源是应用极为广泛的一种电源。直流稳压电源是常用的电子设备,它能保证在电网电压波动或负载发生变化时,输出稳定的电压。一个低纹波、高精度的稳压源在仪器仪表、工业控制及测量领域中有着重要的实际应用价值。 直流稳压电源通常由变压器、整流电路、滤波电路、稳压控制电路所组成,具有体积小,重量轻,性能稳定可等优点,电压从零起连续可调,可串联或关联使用,直流输出纹波小,稳定度高,稳压稳流自动转换、限流式过短路保护和自动恢复功能,是大专院校、工业企业、科研单位及电子维修人员理想的直流稳压电源。适用于电子仪器设备、电器维修、实验室、电解电镀、测试、测量设备、工厂电器设备配套使用。几乎所有的电子设备都需要有稳压的电压供给,才能使其处于良好的工作状态。家用电器中的电视机、音响、电脑尤其是这样。电网电压时高时低,电子设备本身耗供电造成不稳定因家。解决这个不稳定因素的办法是在电子设备的前端进行稳压。 直流稳压电源广泛应用于国防、科研、大专院校、实验室、工矿企业、电解、电镀、充电设备等的直流供电。 1.1直流稳压电源设计目的 (1)、学习直流稳压电源的设计方法; (2)、研究直流稳压电源的设计方案; (3)、掌握直流稳压电源的稳压系数和内阻测试方法。 1.2课程设计的组成部分 1.2.1 设计原理

数据结构课程设计报告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

project项目管理实验报告

计算机辅助项目管理 课程报告 班级: 学号: 姓名: 指导教师: 完成日期: -

目录 1、项目概况 (2) 1.1项目简介 (3) 1.2项目任务关系、固定成本及资源需求量 (2) 1.3可用资源 (2) 2、项目的实施计划 (3) 2.1初始计划 (3) 2.2初始计划的调整和优化 (5) 3、跟踪监控 3.1第一轮监控 (7) 3.2第二轮监控 (21) 3.3第三轮监控 (25) 3.4第四轮监控 (25) 4、项目完工总结分析报告 4.1总结分析报告 (26) 4.2分析实施和管理的成效 (26) 4.3目标实现措施的分析 (26) 5.学习思考总结 5.1问题思考 (27) 5.2问题分析与总结 (28) PROJECT项目管理课程报告

1、项目概况 1.1项目简介 项目的主要工作是维修某主要道路下一段长约1公里的供水管道,市政局要求电力部门配合施工,同时铺设一条地下电缆,以增加该道路两侧的用电用户。由于该项目是在现有道路上开挖,故市政局决定在回填后顺便铺设新的混凝土路面。为此,专门成立了一个项目管理办公室,以管理、协调该项目。项目内容包括:供水工程、电力工程和道路工程。整个项目从2016年7月1日提交预算报批为开始,市政局希望将项目施工对公众造成的影响降至最低,故希望该项目能在2016年10月底竣工并恢复交通。 1.2项目任务关系、固定成本及资源需求量 项目各项任务逻辑关系及固定成本(设备费、材料费等)、资源需求量如表1。 表1 工程工艺关系、固定成本及所需资源表 编号工序名称固定 成本 紧前 工序 资源需求 技工壮工 人数工日人数工日 1 道路及配套工程 2 准备工作 3 预算报批5000 4 对外公告1500 3 5 开走路上停留 的车辆 2000 4 3 6 6 开挖槽沟50000 5 15 200 7 供水工程5000 8 维修水管50000 6 12 200 35 500 9 压力试验1500 8 5 10 10 电力工程 11 支设新电杆15000 5 5 50 10 75 12 铺设电缆50000 6 8 50 25 150 13 吊装变压器75000 11,12,16 15 100 25 250 14 电力入户25000 13 20 240 20 240 15 道路工程25000 16 剪除树枝1500 5 6 12 17 复铺路面150000 9,12 20 300 30 420 18 恢复交通14,17 预算报批需1周,对外公告需2周时间。 1.3可用资源

EDA课程设计说明书参考格式

<>课程设计说明书 题目 院、部: 学生姓名: 指导教师:王晓丽职称助教 专业: 班级: 完成时间:

摘要(三号,黑体,居中,字间空两格字符) (空二行换行) 空4格打印摘要内容(小四号宋体,行距20)。 关键词:(摘要内容后下空一行打印“关键词”三字(小四号黑体),其后为关键词(小四号宋体),每一关键词之间用分号隔开,最后一个关键词后不打标点符号。 ABSTRACT ①居中打印“ABSTRACT”,再下空二行打印英文摘要内容。②摘要内容每段开头留四个空字符。③摘要内容后下空一行打印“Key words”,其后为关键词用小写字母,每一关键词之间用分号隔开,最后一个关键词后不打标点符号。 Key words :aaa;bbb;ccc

目录(3号,黑体,居中) (空1行,以小4号黑体设置字体及大小,行间距22、字间距标准) 1 XXXXXX………………………………………………………………………… 1.1 XXXXXX……………………………………………………………………… 1.2 XXXXXX……………………………………………………………………… ┇ 2 XXXXXX………………………………………………………………………… 2.1 XXXXXX……………………………………………………………………… 2.2 XXXXXX……………………………………………………………………… ┇ 3 4 结束语 参考文献………………………………………………………………………………. 致谢……………………………………………………………………………………附录……………………………………………………………………………………

分支限界法实现单源最短路径问题

实验五分支限界法实现单源最短路径 一实验题目:分支限界法实现单源最短路径问题 二实验要求:区分分支限界算法与回溯算法的区别,加深对分支限界法的理解。 三实验内容:解单源最短路径问题的优先队列式分支限界法用一极小堆来存储活结点表。其优先级是结点所对应的当前路长。算法从图G的源顶点s和空优先队列开始。 结点s被扩展后,它的儿子结点被依次插入堆中。此后,算法从堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点。如果从当前扩展结点i到顶点j有边可达,且从源出发,途经顶点i再到顶点j的所相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中。这个结点的扩展过程一直继续到活结点优先队列为空时为止。 四实验代码 #include using namespace std; const int size = 100; const int inf = 5000; //两点距离上界 const int n = 6; //图顶点个数加1 int prev[n]; //图的前驱顶点 int dist[] = {0,0,5000,5000,5000,5000}; //最短距离数组 int c[n][n] = {{0,0,0,0,0,0},{0,0,2,3,5000,5000}, //图的邻接矩阵 {0,5000,0,1,2,5000},{0,5000,5000,0,9,2}, {0,5000,5000,5000,0,2},{0,5000,5000,5000,5000,0}}; const int n = 5; //图顶点个数加1 int prev[n]; //图的前驱顶点 int dist[] = {0,0,5000,5000,5000}; int c[][n] = {{0,0,0,0,0},{0,0,2,3,5000},{0,5000,0,1,2},{0,5000,5000,0,9}, {0,5000,5000,5000,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("请输入某项目的信息,并请用整形数字表示(格式:弧头,

课程设计报告撰写规范

.课程设计报告撰写规范

————————————————————————————————作者:————————————————————————————————日期: 2

江西理工大学应用科学学院信息工程系 课程设计规范 (试行) 信息工程系 二○一○年六月

第1章内容要求 第1章内容要求 课程设计报告由以下几个部分组成组成,依次为: I、统一的封面,封面之后为课设评分表及答辩记录表; II、摘要; III、目录; IV、课程设计总结报告正文; V、总结(本课题核心内容、特点和方案的优缺点、改进方向和意见)VI、按统一格式列出主要参考文献。 1

第2章格式要求 第2章格式要求 课程设计报告每部分从新的一页开始,各部分要求如下: 2.1封面 统一的封面(含课程设计课题名称、专业、班级、姓名、学号、指导教师等,详见第五部分“格式范例”) 2.2摘要 应概括地反映出本课程设计的主要内容,包括工作目的、实验研究方法、研究成果和结论,重点是本论文的主要工作。摘要力求语言精炼准确,建议500字以内。摘要中不要出现图片、图表、表格或其他插图材料。 关键词是为了便于作文献索引和检索工作而从论文中选取出来用以表示全文主题内容信息的单词或术语。 关键词在摘要内容后另起一行标明,一般3~5个,之间用“;”分开。 2.3 目录 目录由标题名称和页码组成,包括:正文(含结论)的一级、二级和三级标题和序号。具体格式见第五部分“格式范例”。 2.4 符号说明 如果课程设计报告中使用了大量的物理量符号、标志、缩略词、专门计量单位、自定义名词和术语等,应将全文中常用的这些符号及意义列出。如果上述符号和缩略词使用数量不多,可以不设专门的主要符号表,但在报告中出现时须加以说明。缩略词应列出中英文全称。 2

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

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

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

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

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

迪杰斯特拉算法流图:

单源最短路径 贪心算法

实验三单源最短路径 一、实验目的及要求 掌握贪心算法的基本思想 用c程序实现单源最短路径的算法 二、实验环境 Window下的vc 2010 三、实验内容 1、有向图与单源点最短路径 2、按路径长度非降的次序依次求各节点到源点的最短路径 3、Dijkstra算法 四、算法描述及实验步骤 设给定源点为Vs,S为已求得最短路径的终点集,开始时令S={Vs} 。当求得第一条最短路径(Vs ,Vi)后,S为{Vs,Vi} 。根据以下结论可求下一条最短路径。 设下一条最短路径终点为Vj ,则Vj只有:源点到终点有直接的弧 ;从Vs 出发到Vj 的这条最短路径所经过的所有中间顶点必定在S中。即只有这条最短路径的最后一条弧才是从S内某个顶点连接到S外的顶点Vj 。 若定义一个数组dist[n],其每个dist[i]分量保存从Vs 出发中间只经过集合S中的顶点而到达Vi的所有路径中长度最小的路径长度值,则下一条最短路径的终点Vj必定是不在S中且值最小的顶点, 即:dist[i]=Min{ dist[k]| Vk∈V-S } 利用公式就可以依次找出下一条最短路径。 在程序中c[][]表示带权邻接矩阵, dist[]表示顶点到源点的最短路径, p[]记录顶点到源点最短路径的前驱节点, u源点,函数Way是递归的构造出最短路径的次序。 五、实验结果 程序执行的结果: 六、源代码 #include #include using namespace std;

#define MAX 999 void getdata(int **c,int n) { int i,j; int begin,end,weight; for (i=1;i<=n;i++) { for (j=1;j<=n;j++) { if(i==j) c[i][j]=0; else c[i][j]=MAX; } } do { cout<<"请输入起点终点权值(-1退出):"; cin>>begin; if(begin==-1) break; cin>>end>>weight; c[begin][end]=weight; } while(begin!=-1); } void Dijkstra(int n,int v ,int *dist,int *prev,int **c) { bool s[MAX]; int i,j; for (i=1;i<=n;i++) { dist[i]=c[v][i]; //从源点到各点的值 s[i]=false; if(dist[i]==MAX) prev[i]=0; //最大值没有路径 else prev[i]=v; //前驱为源点 } dist[v]=0;s[v]=true; for (i=1;i<=n;i++) { int temp=MAX; int u=v; for(j=1;j<=n;j++) if((!s[j])&&(dist[j]

Project实验报告

Project实验报告 朱曦朦 学号:2010306202412 信管1001 实验目的: 通过做出一个标准的实验,了解project的基本运用方法和实验步骤,掌握设定项目的开始日期的基本方法。完成资源的优化配置,实现资源的充分利用。并对工期做一个初步的调整, 提高估计工期的精确度,掌握PERT的方法,实现整个过程的最优配置。对甘特图,关键路径等基本定义有一个初步的了解,初步学习到PROJECT的基本内容。 一;定义起始时间:

在定义项目中进行时间的确认: 一直保存至第三步,进行初始化的设定。二复制新产品模板.

三调整资源的最大单位 修改资源“产品工程设计”的最大单位为200%,并增加资源“生产线”(工时资源,100%,用于完成生产任务,原来工程师需要5小时完成的任务,生产线只要1小时就能完成,但必须同时配1名产品工程设计进行监控)。 通过视图进入资源工作表,将“产品工程设计”的最大单位改为200% 在甘特图中未找到工程师,所以未对其进行修改。

三.为了提高估计工期的精确度,采用PERT技术规划项目工期(选取2到3个任务进行规划)。 设置PERT权重 设置后观察得到PERT项工作表。 选取2,3个项目后确定乐观工期,预期工期,悲观工期,通过计算PERT得出结论。

四.分析项目工期由哪些任务决定,确定压缩工期的方法。通过格式中的甘特图向导,对关键路径进行确认,从而得到确定项目工期的任务,由红线显 示。编号为2,3,5,6,8,9,10,11 的链接关系,将后面的工期开始时间提前,如下图所示。

实验总结: 通过按要求做实验,初步掌握的project的基本方法,但大部分还是按照书本的内容照搬,自己缺乏独立的融会贯通并将只是运用到实际甘特图中,并且,在有一些需要拓展的部分自己还是缺乏想法,没能很好地掌握知识。后面还需要多加练习,对制图还有一定的兴趣,但还是缺乏足够的训练。

数据结构课程设计报告_最短路径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; //初始化置任意两城市之间距离为无穷大,即两城市之间没有直接通路

单源最短路径问题

实验四单源最短路径问题 一、实验目的: 1、理解分支限界法的剪枝搜索策略; 2、掌握分支限界法的算法柜架; 3、掌握分支限界法的算法步骤; 4、通过应用范例学习动态规划算法的设计技巧与策略; 二、实验内容及要求: 1、使用分支限界法解决单源最短路径问题。 2、通过上机实验进行算法实现。 3、保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。 三、实验原理: 分支限界法的基本思想: 1、分支限界法与回溯法的不同: 1)求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。 2)搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。 2、分支限界法基本思想: 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。 在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。

此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。 3、常见的两种分支限界法: 1)队列式(FIFO)分支限界法 按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。 2)优先队列式分支限界法 按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。 四、程序代码 #include using namespace std; int matrix[100][100]; // 邻接矩阵 bool visited[100]; // 标记数组 int dist[100]; // 源点到顶点i的最短距离 int path[100]; // 记录最短路的路径 int source; // 源点 int vertex_num; // 顶点数 int edge_num; // 边数 int destination; // 终结点 void Dijkstra(int source) { memset(visited, 0, sizeof(visited)); // 初始化标记数组 visited[source] = true; for (int i = 0; i < vertex_num; i++) { dist[i] = matrix[source][i]; path[i] = source; } int min_cost; // 权值最小 int min_cost_index; // 权值最小的下标 for (int i = 1; i < vertex_num; i++) // 找到源点到另外 vertex_num-1 个点的最短路径{ min_cost = INT_MAX;

网络计划实验报告

PERT 实验 商业中心建设活动持续时间表 活动紧前活动需要时间(周) A 设计-20 B 批准-10 C 招标A, B8 D 建设C24 E 外装修D8 F 谈判A,B14 G 签约F10 H 区域分割D, G6 I 内装修H12 J 进驻I, E6 正常正常加急加急最大成本/时间 时间成本时间成本减少比率 A*203012808 6.25 B101010100- C*8106162 3.0 D*24 230020 2340410.0 E8110 4 1204 2.5 F141210204 2.0 G1*******- H* 6202254 1.25 I* 12160101702 5.0 J*6106100- 根据以上表格给出的信息,用PERT软件画出项目网络计划图,并进行网络计算与优化设计。

网络计划方法: 大型项目的开发涉及很复杂的项目协调和管理问题,为使项目管理人员对项目进度有全面的了解,进行有效的控制,必须使用科学的管理方法;网络计划法是使用最广泛的方法之一,关键路径法(critical path method 缩写为CPM)和项目评审技术(program evaluation and review technique 缩写为PERT)是两种使用最广泛的网络计划技术。网络计划方法的优点使它适用于生产技术复杂,工作项目繁多,且紧密联系的一些跨部门的工作计划,如:新产品研制开发;大型工程项目建设;生产技术准备;复杂设备的大修计划。 网络计划方法的基本原理: 将工程项目分解为相对独立的活动,根据各活动先后顺序、相互关系以及完成所需时间做出反映项目全貌的网络图;从项目完成全过程着眼,找出影响项目进度的关键活动和关键路线,通过对资源的优化调度,实现对项目实施的有效控制和管理。 网络计划方法的主要功能: 1用网络图描述一个实际项目的管理问题 (画网络图); 2计算项目的最早、最晚完成和开工时间 (网络计算); 3寻找关键活动和关键路径(网络分析); 4根据以上分析对网络进行优化 PERT网络分析法 PERT网络分析法(计划评估和审查审技术,Program Evaluation and Review Technique) PERT(Program Evaluation and Review Technique)即计划评审技术,最早是由美国海军在计划和控制北极星导弹的研制时发展起来的。PERT技术使原先估计的研制北极星潜艇的时间缩短了两年。简单地说,PERT是利用网络分析制定计划以及对计划予以评价的技术,它能协调整个计划的各道工序,合理安排人力、物力、时间、资金,加速计划的完成。在现代计划的编制和分析手段上,PERT被广泛的使用,是现代化管理的重要手段和方法。 一.画网络图 画网络图应注意以下规则: 1、按工作本身的逻辑顺序连接箭线 2、网络图中不允许出现循环线路 3、在网络图中不允许出现代号相同的箭线 4、在一个网络图中只允许有一个起点节点,一般只允许出现一个终点节点(多目标网络图除外) 5、在网络图中不允许出现有双向箭头或无箭头的线段 6、网

课程设计报告书正文标准格式

课 程 设 计 报 告 书 专 用 纸 1 引言(或绪论)(可作为正文第1章标题,用小3号黑体,加粗, 并留出上下间距为:段前0.5行,段后0.5行) ×××××××××(小4号宋体,20磅行距)××××××××××××××××××××××××××××××………… 1.1 ××××××(作为正文2级标题,用4号黑体,加粗) ×××××××××(小4号宋体,20磅行距)×××××××××××××××××××××××××××××××………… 1.1.1 ××××(作为正文3级标题,用小4号黑体,不加粗) ×××××××××(小4号宋体,20磅行距)×××××××××××××××××××××××××××………… 2 ×××××××(作为正文第2章标题,用小3号黑体,加粗, 并留出上下间距为:段前0.5行,段后0.5行) ×××××××××(小4号宋体,20磅行距)×××××××××××××××××××××××××××××××××××………… ×××××××××××××××××××………… ………… 注:1.正文中表格与插图的字体一律用5号宋体; 2.正文各页的格式请以此页为标准复制。 请留出一个汉字的空间,下同

报告中的内容仅为参考字体格式,与本次设计无关! 题目 内部排序教学软件。 1需求分析和说明 内部排序教学软件的总体目标:在TURBO C2.0 的开发环境下,利用所学C语言和数据结构的相关知识,开发一个具有良好人机界面的内部排序教学软件,实现各种内部排序,并能使用户通过其显示结果对每种排序方法的性能有一个直观的了解,从而达到教学的目的。 1.1基本要求 (1)界面友好,易与操作。采用菜单或其它人机对话方式进行选择。 (2)实现各种内部排序。包括冒泡排序,直接插入排序,直接选择排序,希尔排序,快速排序,堆排序。 (3)待排序的元素的关键字为整数。可用随机数据和用户输入数据作测试比较。比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换以3次计)。 (4)演示程序以人机对话的形式进行。每次测试完毕显示各种比较指标 的列表,以便比较各种排序的优劣。 1.2各功能模块的功能描述: 1.主函数模块 本模块的主要功能是初始化图形界面,调用各模块,实现软件功能。 2.排序功能及输出子模块 本模块的主要功能是根据用户的选择进行数组的创建,并对输入数据或者随机产生的数据使用六种排序方法进行排序并统计每种方法的移动次数和比较次数,然后输出以表格形式输出。 3.封面和结束画面子模块 本模块的主要功能是当用户打开本软件时模拟软件加载,延时数秒后关闭,并进入图形界面,在用户退出软件时显示结束画面,延时数秒后关闭程序。 4.图形界面子模块 本模块的主要功能是根据用户的选择显示不同的画面,引导用户使用软件所提供的各种功能,并在用户提供必要数据,并选择排序功能时调用排序模块,并显示结果画面。 5.输入子模块 本模块的主要功能是进行光标定位,输出提示文字,并对用户输入数据进行处理,创建数组。 6.鼠标实现模块 本模块的主要功能是为用户提供鼠标操作支持,使用户能使用鼠标进行功能的选择。2详细设计

相关文档
最新文档