判别无向图中任意两个顶点之间是否存在长度为K的简单路径.docx
- 文档编号:1817456
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:14
- 大小:86.61KB
判别无向图中任意两个顶点之间是否存在长度为K的简单路径.docx
《判别无向图中任意两个顶点之间是否存在长度为K的简单路径.docx》由会员分享,可在线阅读,更多相关《判别无向图中任意两个顶点之间是否存在长度为K的简单路径.docx(14页珍藏版)》请在冰豆网上搜索。
判别无向图中任意两个顶点之间是否存在长度为K的简单路径
一、问题描述………………………………………………2
二、设计思路………………………………………………2
三、测试用例设计…………………………………………3
四、详细设计………………………………………………3
五、调试分析………………………………………………5
六、心得体会………………………………………………8
七、参考文献………………………………………………10
八、附录……………………………………………………10
九、课程设计评定表………………………………………15
一、问题描述
题目:
判别无向图中任意两个顶点之间是否存在长度为K的简单路径。
初始条件:
(1)采用邻接表作为存储结构。
(2)编写程序判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径。
(3)测试用例自己设计。
注释:
简单路径,即其顶点序列中不含有重现的顶点
二、设计思路
●存储结构设计
1.采用邻接表作为无向图的存储结构,即顶点序列用一维数组描述,每个顶点所连接的边用单链表存储。
2.增设一个一维数组,用于存储搜索简单路径时所访问的节点。
●主要算法设计
步骤:
3.创建无向图CreateMGaph(MGraph&G)
1输入无向图的顶点数、边数。
2给各个顶点命名,采用字符型编号。
3输入每条边所连接的两个顶点,即各顶点间的相通性初始化。
4每输入一条边,则判断其合法性:
In(SList&L,chara)。
若输入的顶点对中出现了②中没有的新顶点,则提示相应的出错信息,重新输入一条新的边。
2.打印出邻接表:
voidprint(MGraphG)
以每一个顶点为头指针,打印出与该顶点相邻的所有顶点。
然后换行,顺次打印下面的顶点及其相邻点。
3.搜索任意给出的两个顶点间是否存在长度为K的简单路径
若搜索成功则返回成功标志,否则返回失败标志:
intSearch(MGraphG,intx,inty,intk)。
三.测试用例设计
1.输入的顶点数:
5
2.输入的边数;6
3.各顶点名称:
A,B,C,D,E
4.各条边所对应的顶点对:
(A,D)(A,E)(D,E)(D,B)(C,B)(C,E)
5.输入要寻找的顶点对及其简单路径长度分别为:
(A,D),4
四、详细设计
4.1存储结构说明
4.1.1邻接表的存储表示
#defineMAX_VERTEX_NUM20//宏定义,最大顶点数
typedefstructArcNode{//边表结点
intadjvex;
structArcNode*nextarc;
}ArcNode;
typedefstructVNode{//头结点
chardata;
ArcNode*firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedefstruct{
AdjListvertices;
intn,e;
}MGraph;//无向图
4.1.2标记访问过的顶点数组
intvisited[MAX_VERTEX_NUM];//访问标志函数
4.1.3存储已访问过的顶点的数组
intpath[MAX_VERTEX_NUM];
4.2主要函数声明
4.2.1创建无向图
voidCreateMGaph(MGraph&G)
4.2.2寻找各个顶点的位置
charGetValue(MGraphG,inti)
4.2.3判断新输入的顶点是否在图中
intIsIn(MGraphG,charm)
4.2.4返回顶点的值
charGetValue(MGraphG,inti)
4.2.5打印出邻接表
voidprint(MGraphG)
4.2.6查找两顶点m,n之间是否存在长度为k的简单路径
intSearch(MGraphG,intx,inty,intk,intvisited[],intpath[],intd)
4.3主程序
intmain()
{
cout<<"--------------创建无向图------------"< CreateMGaph(G); cout<<"-----------打印邻接表----------------"< print(G); cout<<"----------------寻找长度为K的简单路径--------"< cout<<"寻找路径的两个顶点: "; cin>>m>>n; cout<<"请输入想寻找的简单路径的长度: "; cin>>k; Search(G,x,y,k,visited,path,-1); return0; } 五、调试分析 5.1程序的运行与调试 5.1.1设计程序所应考虑的因素 该程序所要执行的操作是比较简单的,但细到微处却有很多要考虑的因素,如果不面面俱到,考虑全面,则会使运行过程过于简单,程序的功能不够完美。 比如在输入顶点序列的时候,如果先前输入的点序列中已经存在当前读入的点,则要有相应的冲突提示;在输入边的条数时,若边的条数操过了无向图所应有的最大值,则也要提示出错信息,重新输入边数;在生成边的时候,若出现了顶点序列中没有的新顶点,则提示出错,并返回重新输入合法的边;在搜索路径时,搜索成功要输出相应的路径顶点序列,搜索失败时要给出出错信息。 5.1.2程序的调试 在程序执行过程中,主要出现的问题如下: 1.由于程序中所需要的变量很多,则导致有些漏定义或定义重复,造成程序执行出错。 如errorC2065: 'i': undeclaredidentifier。 2.对于循环语句continue,break的用法还不是很熟练,造成死循环或者无法执行语句。 3.函数的类型定义与返回值不匹配,导致出错。 如主函数定义为void型,而却有返回值return0,则提示出错信息‘main': ‘void'functionreturningavalue。 4.定义数组时要预先给出存储空间大小,否则无法生成数组。 如定义intvisited[],出错errorLNK2001: unresolvedexternalsymbol"int*visited"(? visited@@3PAHA)。 5.对于循环操作,如while,for,要给出跳出循环的控制条件,否则会出现死循环而导致运行刷屏。 6.对于条件语句,要中和考虑到所有可能情况,否则会导致执行时彼错输此,明显逻辑错误,不真实。 以上错误,经过仔细的检查与调试后,最终得到了正确的输出。 5.1.3程序的运行结果 程序调试完成后,点击按钮运行,结果如下图所示: 按照【测试用例】依次输入信息,得到如下图所示的运行结果: 5.2算法时间复杂度分析 1.创建无向图的时间复杂度(CreateMGaph(MGraph&G)): O(e) 该算法对每条边执行一次输入操作,故其算法的时间复杂度为O(e),其中e为边的数目。 4.打印邻接表的时间复杂度(print(MGraphG)): O(n) 该算法对每个顶点都输出与之相邻的所有顶点,故其时间复杂度为O(n),n为顶点个数。 5.判断两个顶点之间是否存在路径长度为K的时间复杂度(Search(MGraphG,intx,inty,intk,intvisited[],intpath[],intd)): O (1) 该算法的执行次数直接由路径长度K控制,故其时间复杂度为常量。 5.3算法的现态与优化设想 5.3.1算法的现态 1.对输入的边数有控制条件,不允许其超过最大边数。 2.在初始化边和选择操作边时,若顶点对中出现了顶点序列中没有的新顶点,则给出相应提示。 3.对于搜索成功,能够顺次输出所走路径;对于搜索失败,也能提示相应操作。 4.对于所走路径,顺利将其转化为顶点名称的形式输出,简单明了。 5.3.2算法的优化设想 虽然当前采用的算法其基本功能都能很好的实现,但仍存在一些不足,有待进一步的改进与优化,主要设想如下: 1.增设函数,使其能够对点进行增加和删除操作。 2.增设函数,使其能够对边进行增加和删除操作。 3.对于搜索不成功的顶点对,能够返回他们之间各种所存在路径长度的顶点序列。 4.对于初始化边操作,若输入的顶点对已经存在,则应给与提示,令其重新输入。 六、心得体会 数据结构是一门设计性相当强的科目,它需要把算法思想转变为源程序代码上机调试,把理论知识变为实践能力,可以说,学好了数据结构,就掌握了编程的基本思想与求解一个实际问题的具体思路了。 从第一堂课开始,杜老师就为我们阐述了它的重要性。 刚开始的几周学习中,真的压力好大,由于数据结构的教学思想与传统的科目的课本所传授的思路截然不同,所以思路转变要花费我们好长一段时间来适应。 它对我们来说具有一定的难度,然而它又是其它编程语言的一门基础学科,所以我要努力来学好。 对于课程中所要求的每一个实验,我都尽量自己独立完成,自己实在做不出来的再去向同学请教,把每一个实验都弄懂。 刚拿到课程设计题目的时候觉得没多大难度,就是求无向图中任意两顶点见是否存在长度为K的简单路径。 于是就没在意,想想就是把书上的存储结构写上来,再加上一个搜寻路径的函数就结束了。 当拿起题目,开始着手做的时候,才发现要考虑的因素实在是太多了,搜索函数要用递归,输入的顶点的重复与否需要判断,输入的边是否有效也需要判断,如何进行整型地址与顶点名称间的转化,当新增一条边或新增一个顶点的时候图的变化,等等。 于是,一下子,脑子混了,思路乱了,不知从何下手,写出来的函数基本都有错误,有些调试了好多遍也无法正常运行,真的好让人郁闷。 于是向别人请教,经过与同学的悉心讨论,费了九牛二之力后,终于调试成功了。 而且,在调试过程中,由于C++里检查错误都是用英文来显示出来的,有些出错信息不知道是什么意思,很难理解,耗费了一些时间。 这都是平时做实验的次数少了的缘故,所以以后要自觉的给自己找些小算法来自己尝试着写写了。 值得指出的是,经过这次课程设计,现在已经可以读懂很多错误在英文里的提示了,而且编程思想得到了很大提高,此次课程设计基本上是凭自己的能力独立完成的,思路很清晰,在编程的过程中不断的发现不足,再一步步的改进与完善。 总的来说,很感谢此次课程设计的安排,它让我进一步加深了对算法的了解与设计,编程能力与独立解决问题的能力也有所提升,收获颇丰。 通过这次的课程设计,现在真正的明白了一些代码的应用,每个程序都有一些共同点,比如通用的结构,相似的格式,要学会融会贯通,举一反三。 只要努力去学习,就会灵活的去应用它。 在以后的学习中,我会多花时间在实验上的,因为只有自己真正动手实践了、操作了,编程的能力与算法设计的能力才会发生质的转变。 我会努力的! 七、参考文献 Ⅰ.《数据结构(C语言版)》严蔚敏、吴伟民清华大学出版社 Ⅱ.《数据结构习题集(C语言版)》严蔚敏、吴伟民、米宁清华大学出版社 Ⅲ.《C++程序设计教程》闵联营、何克右武汉理工大学出版社 Ⅴ.《数据结构习题与解析(第2版)》李春葆清华大学出版社 八、附录 附录一(源程序代码清单): #include #include #include //图的邻接表存储表示 #defineMAX_VERTEX_NUM
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 判别 任意 两个 顶点 之间 是否 存在 长度 简单 路径