数据结构最小生成树解决实际问题的课程设计
最小部分树课程设计

最小部分树课程设计一、课程目标知识目标:1. 让学生掌握最小生成树的概念和性质;2. 使学生理解并掌握两种经典的最小生成树算法:普里姆算法和克鲁斯卡尔算法;3. 帮助学生理解最小生成树在实际问题中的应用。
技能目标:1. 培养学生运用最小生成树算法解决问题的能力;2. 培养学生通过分析、比较不同算法,选择合适算法解决问题的能力;3. 培养学生的逻辑思维能力和团队合作能力。
情感态度价值观目标:1. 激发学生对数据结构与算法的兴趣,培养良好的学习习惯;2. 培养学生面对问题积极思考、勇于探索的精神;3. 增强学生的团队合作意识,培养相互尊重、相互协作的品质。
课程性质:本课程为数据结构与算法领域的基础课程,旨在帮助学生掌握最小生成树的相关知识,提高解决问题的能力。
学生特点:学生处于高年级阶段,已经具备一定的数据结构与算法基础,具有较强的逻辑思维能力和自主学习能力。
教学要求:结合学生特点,采用启发式教学,引导学生主动探索、思考,注重培养学生的实际操作能力和团队协作能力。
在教学过程中,将课程目标分解为具体的学习成果,以便进行教学设计和评估。
二、教学内容1. 最小生成树的概念与性质:介绍最小生成树的定义、基本性质和定理,包括切普曼-列宁罗定理和布鲁克定理。
- 教材章节:第三章第二节- 内容列举:最小生成树的定义、切普曼-列宁罗定理、布鲁克定理2. 普里姆算法:讲解普里姆算法的原理、步骤及实现方法。
- 教材章节:第三章第三节- 内容列举:普里姆算法原理、步骤、实现及复杂度分析3. 克鲁斯卡尔算法:介绍克鲁斯卡尔算法的原理、步骤及实现方法。
- 教材章节:第三章第四节- 内容列举:克鲁斯卡尔算法原理、步骤、实现及复杂度分析4. 最小生成树的应用:分析最小生成树在实际问题中的应用,如网络设计、电路设计等。
- 教材章节:第三章第五节- 内容列举:最小生成树在实际问题中的应用案例分析5. 算法比较与分析:比较普里姆算法与克鲁斯卡尔算法的优缺点,分析在不同场景下选择合适算法的策略。
数据结构课程设计报告---最小生成树问题

二○一○届课程设计论文《算法与数据结构》二〇一〇年六月目录一、引言…………………………………………二、设计目的与任务………………………………1·课程设计的目的2·课程设计的任务三、设计方案………………………………………1·需求分析2·概要设计3·详细设计4·程序清单四、调试分析………………………………………五、测试结果………………………………………六、附录……………………………………………七、工作环境………………………………………八、参考文献……………………………《数据结构》课程设计——最小生成树问题一、引言《数据结构》是计算机科学与技术专业和信息系统专业的必修课之一,是一门综合的专业技术课。
本课程较系统的介绍了软件开发过程中常用的数据结构及相应的实现算法。
如线性表、栈、队列、树和二叉树,图、检索和排列等,并对性能进行分析和比较,内容非常丰富。
本课程设计我们要解决的是最小生成树问题。
要用到图的相关数据结构和最小生成树的克鲁斯卡尔算法,以及存储图的边和点的邻接矩阵。
本课程设计要解决的问题是构造连通图的最小生成树我们首先要做的是都造一个邻接表,用以存储图,然后我们要想好怎样利用克鲁斯卡尔算法构造最小生成树,把这个算法写入主程序,调试好程序,最后完成报告。
二、设计目的与任务1·课程设计的目的本课程设计是为了了解并掌握数据结构及算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的相关步骤;提高运用所学理论知识独立分析和解决问题的能力;训练用系统的观点和软件开发的一般规范进行软件开发。
2·课程设计的任务问题描述:若要在n个城市之间建设通信网络,只需架设n—1条线路即可。
如何以最低的经济代价建设这个通信网,是一个最小生成树的问题。
三、设计方案1·需求分析(1)利用克鲁斯卡尔算法求最小生成树;(2)实现教科书6.5节中抽象数据类型MFSet。
数据结构最小生成树课程设计

一、课题描述: 二、需求分析 三、总体结构设计 四、各子模块设计 五、编程设计 六、测试结果 七、总结 八、参考文献 附 录
一、课题描述:
设计一张城市地图,图中的顶点为城市,无向边代表两个城市间的 连通关系,边上的权代表公路造价。图中任一对城市都是连通的,用公 路把所有城市联系起来,设计可使得工程的总造价最少。
八、参考文献
[1] 严蔚敏,吴伟民.数据结构[M].北京:清华大学出版社,2007. [2] 张长海,陈娟.C程序设计[M].北京:高等教育出版社,2004. [3] 谭浩强.C程序设计[M].北京:清华大学出版社,2005. [4]陈杰.计算机专业课程设计中的需求分析[J].集美大学学报,2009. [5]高一凡. 数据结构算法实现及解析[M ]. 西安:西安电子科技大学出版 社, 2002.
邻接矩阵输出结果
造价排序运行结果
最小生成树的输出结果以及公路总造价最小值
七、总结
经过一周不懈的努力我们终于完成了课程设计。通过这次课程设计, 既巩固了以前学过的C语言的知识,体会到C语言超强的逻辑性,能够熟 练使用VC++的编译环境,也对这两门课程有了新的认识,他们既有联 系,又相互区别,要灵活应用。 利用了课本所学的最小成生树,完成了这一课题,深刻的体会到它 的实用性,也发现我们对于C语言和数据结构还有很多地方不知道。程 序设计是脑力劳动和体力劳动相结合的,没有平时基础的训练是不会写 出高效的算法,今后仍需要努力学习。 课让我尝到了学习的快乐,成功的喜悦。要完成一项任务或把东西 学好就必须有足够的信心,持久的耐心,有面对困难无所畏惧的精神, 这对我日后的学习和生活产生了深远一个影响。
二、需求分析
根据课设题目要求,拟将整体程序分为三大模块。此三个模块相 互独立,没有嵌套调用的情况,以下是三个模块的大体分析: 1. 建立一个图,其存储方式可以采用邻接矩阵形式,需要定义两个数 组,一个存储城市,一个存储公路,存储公路的数组表明城市间的连通 关系和公路的造价;。 2. 利用kruskal算法求城市地图的最小生成树 3. 按父亲结点和子女结点集的形式输出生成树中各条边(公路)以 及它们的权值(造价),公路总造价最小值。
最小生成树-课程设计报告

课程设计报告问题描述:已知一个无向连通网表示n个城市以及城市间可能设置的通信线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边上的权值表示相应的代价。
对于n个点的连通网能建立许多不同的生成树,每一棵生成树都可以是一个通信网。
我们要选择一棵生成树,使总的耗费最小(1)需求分析:在N地建设网络保证连通即可求最小的架设方式,任务完成可分为两个部分:A 存储N中任意两地之间的权(采用邻接表,邻接矩阵)B 用prim和克鲁斯卡尔两种算法分别求出N地中最优架设方式即最小生成树。
C 按顺序输出生成树中各条边以及它们的权值。
(2)概要设计:程序分为两大部分 1 存储部分,2 算法部分;存储部分分为邻接矩阵和邻接表,而且包含了两者直接的互相转换;算法部分分为普里母算法和克鲁斯卡尔算法。
Prim算法的思想:假设V是图中顶点的集合,E是图中边的集合,TE为最小生成树中的边的集合,则prim算法通过以下步骤可以得到最小生成树:1:初始化:U={u 0},TE={f}。
此步骤设立一个只有结点u 0的结点集U 和一个空的边集TE作为最小生成树的初始形态,在随后的算法执行中,这个形态会不断的发生变化,直到得到最小生成树为止。
2:在所有u∈U,v∈V-U的边(u,v)∈E中,找一条权最小的边(u 0,v 0),将此边加进集合TE中,并将此边的非U中顶点加入U中。
此步骤的功能是在边集E中找一条边,要求这条边满足以下条件:首先边的两个顶点要分别在顶点集合U和V-U中,其次边的权要最小。
找到这条边以后,把这条边放到边集TE中,并把这条边上不在U中的那个顶点加入到U中。
这一步骤在算法中应执行多次,每执行一次,集合TE和U都将发生变化,分别增加一条边和一个顶点,因此,TE和U是两个动态的集合,这一点在理解算法时要密切注意。
3:如果U=V,则算法结束;否则重复步骤2。
可以把本步骤看成循环终止条件。
我们可以算出当U=V时,步骤2共执行了n-1次(设n为图中顶点的数目),TE中也增加了n-1条边,这n-1条边就是需要求出的最小生成树的边。
最小生成树问题课程设计

最小生成树问题课程设计一、课程目标知识目标:1. 理解最小生成树的概念,掌握其定义及性质;2. 学会运用普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法求解最小生成树问题;3. 了解最小生成树在实际问题中的应用,如网络设计、电路设计等。
技能目标:1. 能够运用普里姆和克鲁斯卡尔算法解决最小生成树问题,并进行算法分析;2. 能够运用所学知识解决实际问题,具备一定的算法设计能力;3. 能够通过合作与交流,提高问题分析和解决问题的能力。
情感态度价值观目标:1. 培养学生对数据结构与算法的兴趣,激发学习热情;2. 培养学生的团队合作意识,学会倾听、尊重他人意见;3. 培养学生面对问题勇于挑战、积极进取的精神。
课程性质:本课程为计算机科学与技术专业的高年级课程,旨在帮助学生掌握图论中的最小生成树问题及其求解方法。
学生特点:学生具备一定的编程基础和图论知识,对算法有一定的了解,但可能对最小生成树问题尚不熟悉。
教学要求:结合学生特点,采用案例教学、任务驱动等方法,注重理论与实践相结合,培养学生的实际操作能力和创新思维。
通过本课程的学习,使学生能够将所学知识应用于实际问题中,提高解决复杂问题的能力。
二、教学内容1. 最小生成树概念与性质- 定义、性质及定理- 最小生成树的构建方法2. 普里姆算法- 算法原理与步骤- 算法实现与复杂度分析- 举例应用3. 克鲁斯卡尔算法- 算法原理与步骤- 算法实现与复杂度分析- 举例应用4. 最小生成树在实际问题中的应用- 网络设计- 电路设计- 其他领域应用案例5. 算法比较与优化- 普里姆与克鲁斯卡尔算法的比较- 算法优化方法及其适用场景6. 实践环节- 编程实现普里姆和克鲁斯卡尔算法- 分析并解决实际问题- 小组讨论与成果展示教学内容依据课程目标进行选择和组织,注重科学性和系统性。
参考教材相关章节,制定以下教学安排:第1周:最小生成树概念与性质第2周:普里姆算法第3周:克鲁斯卡尔算法第4周:最小生成树在实际问题中的应用第5周:算法比较与优化第6周:实践环节与总结三、教学方法本课程将采用以下多样化的教学方法,以激发学生的学习兴趣和主动性:1. 讲授法:教师通过生动的语言和形象的比喻,对最小生成树的概念、性质、算法原理等基础知识进行讲解,使学生快速掌握课程内容。
数据结构实验报告-最小生成树(精选5篇)

数据结构实验报告-最小生成树(精选5篇)第一篇:数据结构实验报告-最小生成树电子科技大学实验报告学生姓名:XXX 学号:20***指导教师:刘峤实验地点:信软楼306实验时间:5月17日一、实验室名称:软件实验室二、实验项目名称:数据结构与算法—图三、实验学时:4四、实验原理:Kruskal 算法是一种按照图中边的权值递增的顺序构造最小生成树的方法。
其基本思想是:设无向连通网为G=(V,E),令G 的最小生成树为T,其初态为T=(V,{}),即开始时,最小生成树T 由图G 中的n 个顶点构成,顶点之间没有一条边,这样T 中各顶点各自构成一个连通分量。
然后,按照边的权值由小到大的顺序,考察G 的边集E 中的各条边。
若被考察的边的两个顶点属于T 的两个不同的连通分量,则将此边作为最小生成树的边加入到T 中,同时把两个连通分量连接为一个连通分量;若被考察边的两个顶点属于同一个连通分量,则舍去此边,以免造成回路,如此下去,当T 中的连通分量个数为1 时,此连通分量便为G 的一棵最小生成树。
如教材153页的图4.21(a)所示,按照Kruskal 方法构造最小生成树的过程如图4.21 所示。
在构造过程中,按照网中边的权值由小到大的顺序,不断选取当前未被选取的边集中权值最小的边。
依据生成树的概念,n 个结点的生成树,有n-1 条边,故反复上述过程,直到选取了n-1 条边为止,就构成了一棵最小生成树。
五、实验目的:本实验通过实现最小生成树的算法,使学生理解图的数据结构存储表示,并能理解最小生成树Kruskal 算法。
通过练习,加强对算法的理解,提高编程能力。
六、实验内容:(1)假定每对顶点表示图的一条边,每条边对应一个权值;(2)输入每条边的顶点和权值;(3)输入每条边后,计算出最小生成树;(4)打印最小生成树边的顶点及权值。
七、实验器材(设备、元器件):八、数据结构及程序#include #include #include typedefstruct {intvex;intgno;}TVex,*TpVex;typedefstruct {intvhead, vtail;intwght;intflag;}TEdge,*TpEdge;typedef struct{TpVex VexList;TpEdge EdgeList;int nvex, nedge;}TGraph, *TpGraph;void begin(TpGraph G){ int i;for(i=1;i<=G->nvex;i++){G->VexList[i-1].gno=i;G->EdgeList[i-1].flag=0;} } int findmin(TpGraph G){ int i,j;int minwght=G->EdgeList[0].wght;for(i=0,j=-1;inedge;i++){ PC机一台,装有C/C++语言集成开发环境。
数据结构课程设计报告(最小生成树)

《数据结构》课程设计报告课程名称:最小生成树课题负责人名(学号):同组成员名单(角色):指导教师:评阅成绩:评阅意见:提交报告时间:2011年12月19日最小生成树计算机科学与技术专业学生:指导老师:[摘要]选择一颗生成树,使之总的消费最少,也就是要构造连通网的最小代价生成树(简称为最小生成树)的问题,一颗生成树的代价就是树上各边的代价之和,构造最小生成树可以有多种算法,其中多数算法利用了MST的性质。
关键词:最小生成树连通图普里姆算法克鲁斯卡尔算法 MST一、设计目的1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
二、算法思想分析该设计的要求是在n个城市之间建设网络,不仅要保证连通,还要求是最经济的架设方法。
根据克鲁斯卡尔和普里姆算法的不同之处,该程序将城市个数大于十个时应用普里姆算法求最小生成树,而城市个数小于十个时则应用克鲁斯卡尔进行计算。
1.算法思想1)普里姆(Prim)算法思想a)选择从0节点开始,并选择0节点相关联的最小权值边,将与这条边相关联的另一顶点出列;b)在出列的节点中相关联的所有边中选择一条不与另一个已出列的节点相关联的权值最小的边,并将该边相关联的节点出列;c)重复b)直到所有的节点出列。
2)克鲁斯卡尔(Kruskal)算法思想为了使生成树上总的权值之和最小,应该使每一条边上的权值尽可能的小,所以应从权值最小的边选起,直至选出n-1条不能构成回路的权值最小的边位置。
具体做法如下:首先构造一个含n个顶点的森林,然后按权值从小到大从连通图中选择不使森林中产生回路的边加入到森林中去,直至该森林变成一棵树为止,这棵树便是连通图的最小生成树。
数据结构课程设计求最小生成树

##大学数据结构课程设计报告题目:图的最小生成树院(系):学生姓名:班级:学号:起迄日期:指导教师:2011—2012年度第 2 学期一、需求分析1.问题描述:设计要求:在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。
存储结构采用多种。
求解算法多种。
该题目需要运用最小生成树来解决。
最小生成树的代价之和最小,所以是一种最经济的架设方法。
2.基本功能该程序是解决城市间架设网络问题的,采用邻接表与邻接矩阵对构造的图进行存储,用普利姆与克鲁斯卡尔算法进行求解。
3.输入输出首先输入顶点的个数以及边的个数,格式如:4 6。
然后输入边的权值,格式如:a b 1。
输出分为四种输出,输出邻接表,邻接矩阵,普利姆算法求得的最小生成树,克鲁斯卡尔求得的最小生成树。
最小生成树的格式为:<顶点名顶点名>权值。
二、概要设计1.设计思路:问题的解决分别采用普利姆算法已经克鲁斯卡尔算法。
1)普利姆算法就是先选择根,把它放入一个集合U中,剩余的顶点放在集合V中。
然后选择该顶点与V中顶点之间权值最小的一条边,依此类推,如果到达最后一个则返回上一个顶点。
2)克鲁斯卡尔算法就是写出所有的顶点,选择权最小的边,然后写出第二小的,依此类推,最终要有个判断是是否生成环,不生成则得到克鲁斯卡尔的最小生成树。
2.数据结构设计:1.抽象数据类型如下:ADT Graph{ 数据对象 V:v是具有相同特征的数据元素的集合,称为顶点集。
数据关系 R:R={VR}VR={<v,w>|v,w属于v且p(v,w)表示从v到w的弧,谓词p(v,w)定义了弧<v,w>的意义或信息}基本操作:1)GreatGraph(&G,V,VR);初始条件:V是图的顶点集,VR是图中弧的集合。
操作条件:按V和VR的定义构造图G。
2)LocateVex(G,u);初始条件:图G存在,u和G中顶点有相同的特征。
操作条件:若G中存在顶点u,则返回该顶点在图中的位置;否则返回其他信息。
求最小生成树课程设计

求最小生成树课程设计一、教学目标本节课的教学目标是让学生掌握求最小生成树的基本算法和应用。
通过本节课的学习,学生应能理解最小生成树的概念,掌握普里姆算法和克鲁斯卡尔算法的原理和实现,并能运用所学知识解决实际问题。
具体来说,知识目标包括:1.了解最小生成树的概念及其在实际应用中的重要性。
2.掌握普里姆算法和克鲁斯卡尔算法的原理。
3.理解最小生成树的两种主要算法及其优缺点。
技能目标包括:1.能够运用普里姆算法和克鲁斯卡尔算法求解最小生成树问题。
2.能够分析实际问题,选择合适的最小生成树算法求解。
情感态度价值观目标包括:1.培养学生对计算机科学和图论的兴趣。
2.培养学生独立思考、合作交流的能力。
3.使学生认识到算法在解决实际问题中的重要性。
二、教学内容本节课的教学内容主要包括最小生成树的概念、普里姆算法和克鲁斯卡尔算法的原理及其实现。
1.最小生成树的概念:介绍最小生成树的定义及其性质,通过实例让学生理解最小生成树的意义。
2.普里姆算法:讲解普里姆算法的原理,引导学生理解算法的基本思路,并通过编程实现普里姆算法。
3.克鲁斯卡尔算法:讲解克鲁斯卡尔算法的原理,让学生了解算法的基本思路,并通过编程实现克鲁斯卡尔算法。
4.算法比较:分析普里姆算法和克鲁斯卡尔算法的优缺点,让学生了解在实际问题中如何选择合适的算法。
三、教学方法为了提高学生的学习兴趣和主动性,本节课将采用多种教学方法,如讲授法、讨论法、案例分析法和实验法等。
1.讲授法:讲解最小生成树的概念、普里姆算法和克鲁斯卡尔算法的原理。
2.讨论法:学生讨论算法优缺点,培养学生独立思考和合作交流的能力。
3.案例分析法:分析实际问题,引导学生运用所学知识解决实际问题。
4.实验法:让学生动手编程实现普里姆算法和克鲁斯卡尔算法,提高学生的实际操作能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:《图论与算法分析》等教材,为学生提供理论知识的学习。
数据结构实验报告最小生成树

数据结构实验报告最小生成树实验目的:掌握最小生成树的概念和算法,培养分析和解决实际问题的能力。
实验内容:利用Kruskal算法求解带权无向连通图的最小生成树。
实验原理:最小生成树是指一个连通图的生成树,其中所有边的权值和最小。
最小生成树问题在图论中有着重要的应用,如网络设计、集成电路布线等领域。
本次实验使用Kruskal算法求解最小生成树。
Kruskal算法基于一个贪心的思想:每次选择权值最小的边,直到生成树中包含所有的节点。
具体算法如下:1.根据给定的连通图构造一个边的集合E,E中包含图中所有的边。
2.将E中的边按照权值从小到大排序。
3.依次遍历排序后的边,如果该边的两个节点不在同一个连通分量中,则选择该边,并将这两个节点合并到一个连通分量中。
4.重复第3步,直到生成树中包含所有的节点。
实验步骤及结果:1.根据给定的连通图构造边的集合E,并将E中的边按照权值从小到大排序。
2.初始化一个空的集合T作为最小生成树的边集合。
3.依次遍历排序后的边,如果该边的两个节点不在同一个连通分量中,则选择该边,并将这两个节点合并到一个连通分量中,同时将该边添加到集合T中。
4.重复第3步,直到生成树中包含所有的节点。
实验结果分析:通过Kruskal算法,可以得到带权无向连通图的最小生成树。
最小生成树具有多个优点,如能够保证连通、权值最小、无回路。
在实际应用中,最小生成树常常用于网络设计、集成电路布线等领域。
实验总结:通过本次实验,我掌握了最小生成树的概念和Kruskal算法的原理和实现方法。
实验中,我通过定义边的数据结构和构造边的集合,实现了Kruskal算法求解最小生成树。
通过实验,我深刻认识到数据结构在解决实际问题中的重要性和实用性。
最小生成树作为一种常用的图论算法,在实际应用中具有广泛的应用和重要的价值。
掌握了最小生成树的概念和算法,我相信能够在今后的学习和工作中更好地应用数据结构算法解决实际问题。
《数据结构》课程设计 普里姆算法 最小生成树

[i].stop_vex,lge[i].weight); /*输出N-1条最小边的信息*/
for(i=0;i<12;i++)
{
line(vex[lge[i].start_vex][0],vex[lge[i].start_vex][1],vex[lge
lge[min]=lge[i];
lge[i]=edge;
vx=lge[i].stop_vex;
for(j=i+1; j<pgraph->n-1; j++)
{
vy=lge[j].stop_vex;
weight=pgraph->arcs[vx][vy];
if(weight<lge[j].weight)
{
{550,250},{520,330},{430,400},{350,450},{270,400},{200,330}};
/*初始化个顶点的坐标*/
int info[12][12];
char *text;
void initalGraph(int vec[][2]) /*画出顶点函数*/
{
int gd=DETECT,gm;
[i].stop_vex][0],vex[lge[i].stop_vex][1]);
}
/*根据生成的最小边数组连线*/
printf("---It is done!---");
getch();
exit(1);
}
此程序再TURBOC2.0环境中编译通过运行.TURBOC2.0下载的地址
数据结构实验最小生成树

数据结构实验最小生成树数据结构实验报告最小生成树问题一、问题描述:若要在n个城市之间建设通信网络,只需要架设n-1条线路即可。
如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题基本要求(1)从文件中读入图的信息。
(2)利用克鲁斯卡尔算法求网的最小生成树。
(3)以文本形式生成树中各条边以及他们的权值。
二(需求分析:1、需定义结构体数组,根据权值逐一选择边。
三(概要设计抽象数据类型:需定义结构体数组,存储每条边的起点,终点,权值。
算法的基本思想:1、图的信息的读取:定义结构体数组,存储每条边的起点,终点,权值。
2、对每条边在数组中的位置处理:选边需从最小的开始,故按边的权值从小到大进行排序。
3、边的选取: 从最小的边的开始,若边的两端点不属于同一集合,则选取该边。
并将该边的两个顶点所在的两个集合合并成为一个。
因为有n个顶点,故只需选取n-1条边。
程序的流程:(1) 输入模块: 读入图的信息(顶点和边,用结构体数组进行存储)。
(2) 处理模块:Kruskal算法。
(3) 输出模块:将结果输出。
四(详细设计:算法的具体步骤:struct G{int fromvex;int endvex;int weight;}GE[100],cur[100];void swap(G* GE,int i,int j){ //交换函数int temp=GE[i].fromvex;GE[i].fromvex=GE[j].fromvex;GE[j].fromvex=temp;temp=GE[i].endvex;GE[i].endvex=GE[j].endvex;GE[j].endvex=temp;temp=GE[i].weight;GE[i].weight=GE[j].weight;GE[j].weight=temp;}void Kruskal(int n){int i,j,k=0,pos=-1,m1,m2;bool** s=new bool *[n];//定义一个二维数组,用来判断是否为同一类for(i=0;i<n;i++)s[i]=new bool[n];for(i=0;i<n;i++){for(j=0;j<n;j++){if(i==j)s[i][j]=true; //初始化数组elses[i][j]=false;}}while(k<n-1){for(i=0;i<n;i++){if(s[i][GE[k].fromvex]==1)m1=i;if(s[i][GE[k].endvex]==1)m2=i;}if(m1!=m2){//判断是否为同一类,如果为同一类(该类中所有的点到起点和终//点的边在s 数组中赋为1),cur[++pos].fromvex=GE[k].fromvex;cur[pos].endvex=GE[k].endvex;cur[pos].weight=GE[k].weight;for(i=0;i<n;i++){if(s[m1][i] || s[m2][i])//把该点添加到该类,并和并两个类s[m1][i]=1;elses[m1][i]=0;s[m2][i]=0;}}k++;}for(i=0;i<n;i++){delete []s[i];}}int main(){int i,j;int numVertex,numEdge;cout<<"请输入点的个数和边的条数:"<<endl; cin>>numVertex>>numEdge;cout<<"请输入边的起始位置和边的权值:"<<endl;for(i=0;i<numEdge;i++)cin>>GE[i].fromvex>>GE[i].endvex>>GE[i].weight;for(i=0;i<numEdge;i++)for(j=i;j<numEdge;j++){if(GE[j].weight<GE[i].weight)//将边的权值按从小到大排列swap(GE,i,j);}Kruskal(numEdge);for(i=0;i<numVertex-1;i++) cout<<cur[i].fromvex<<"->"<<cur[i].endvex<<":"<<cur[i].weight<<endl;system("pause");return 0;}五(调试分析:将选边的过程输出来检验算法的正确性。
最小生成树问题-数据结构课程设计

实习5、最小生成树问题一、需求分析1.问题描述若要在n个城市间建设通信网络,只需要架设n-1条线路即可。
如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。
2.基本要求(1)利用克鲁斯卡尔算法求网的最小生成树。
(2)实现教科书6.5节中定义的抽象数据类型MFSet。
以此表示构造生成树过程中的连通分量。
(3)以文本形式输出生成树中各边以及它们的权值。
3.测试数据4. 实现提示通信线路一旦建立,必然是双向的。
因此,构造最小生成树的网一定是无向网。
设图的顶点数不超过30个,并为简单起见,网中边的权值设成小于100的整数,可利用C语言提供的随机函数产生。
图的存储结构的选取应和所做操作相适应。
为了便于选择权值最小的边,此题的存储结构既不用邻接矩阵的数组表示法,也不选用邻接表,而是以存储边(带权)的数组表示图。
二、概要设计ADT Graph{数据对象V:V是具有相同特性的数据元素的集合,成为顶点集。
数据关系R:R={VR}VR={<v,w>|v,w∈V且P(v,w), <v,w>表示从v到w的弧,谓词P(v,w)定义了弧<v,w>的意义或信息}基本操作:CreateUDN( *G)操作结果:创建无向图。
MiniSpanTree(G,minedge)(使用克里斯卡尔算法始终调试不成功只好改用普利姆算法)初始条件:图G存在。
操作结果:求图G的最小生成树。
PrintMinEdge(G,minedge)初始条件:图G存在。
操作结果:输出图G的最小生成树。
}ADT Graph三、详细设计(源代码)(使用C语言时指针参数传递总是出问题只好改用C++语言)#include <stdio.h>#include <stdlib.h>#define MAX 10//本程序设最大顶点数为10typedef struct{int vexnum;//点数量int arcnum;//边数量int arcs[MAX][MAX];//边存储char vexs[MAX];//点存储}iGraph;typedef struct close{int adjvex;int endvex;int lowcost;//最小权值}*closedge,closedges;void CreateUDN(iGraph *G){//创建无向图int i,j,m,k,l,cost;char name1,name2;printf("请输入顶点数和边数(注意:边数大于或等于顶点数):\n");scanf("%d %d",&G->vexnum,&G->arcnum);getchar();printf("请输入各个顶点名字:\n");for(i=0;i<G->vexnum;i++){scanf("%c",&G->vexs[i]);getchar();}for(i=0;i<G->vexnum;i++)for(j=0;j<G->vexnum;j++)G->arcs[i][j]=100; //初始化边的权值此程序设100为最大值for(i=0;i<G->arcnum;i++){printf("请输入第%d条边(输入格式为:端点1-端点2:权值):\n",i+1);scanf("%c-%c:%d",&name1,&name2,&cost);getchar();for(j=0;j<G->vexnum;j++)//在表中查找点{if(name1==G->vexs[j])k=j;}for(m=0;m<G->vexnum;m++)//在表中查找点{if(name2==G->vexs[m])l=m;}if(k==l)//两个点如果相同,报错{i--;printf("输入错误的数据,请重新输入\n");continue;}G->arcs[k][l]=cost;//无向边赋权值G->arcs[l][k]=cost;}//使输入的边赋值for(i=0;i<G->vexnum;i++)for(j=0;j<G->vexnum;j++)if(i==j)G->arcs[i][j]=0;//如果端点相同,则不存在边}void MiniSpanTree(iGraph G,closedge &minedge){//求最小生成树int i,j,k,z;int temp;int currentmin;k=0;minedge=(closedge)malloc((G.vexnum+1)*sizeof(closedges));for(j=1;j<G.vexnum;j++){minedge[j-1].adjvex=k;minedge[j-1].endvex=j;minedge[j-1].lowcost=G.arcs[k][j];}for(i=0;i<G.vexnum-1;i++){currentmin=minedge[i].lowcost;k=i;for(j=i+1;j<G.vexnum-1;j++){if(minedge[j].lowcost<currentmin){currentmin=minedge[j].lowcost;k=j;}}//交换第k个元素和第i个元素temp=minedge[i].adjvex;minedge[i].adjvex=minedge[k].adjvex;minedge[k].adjvex=temp;temp=minedge[i].endvex;minedge[i].endvex=minedge[k].endvex;minedge[k].endvex=temp;temp=minedge[i].lowcost;minedge[i].lowcost=minedge[k].lowcost;minedge[k].lowcost=temp;for(j=i+1;j<G.vexnum-1;j++){z=minedge[i].endvex;//Z为新找到的顶点k=minedge[j].endvex;if(k!=z){if(G.arcs[z][k]<minedge[j].lowcost){minedge[j].adjvex=z;minedge[j].lowcost=G.arcs[z][k];//和以前的节点比较,如果边的权值小,则选取已有的结点中权值最小的边}}}}}void PrintMinEdge(iGraph G,closedge minedge)//输出所求最小生成树{int i,sum;sum=0;printf("最小生成树对应的边为\n");for(i=0;i<G.vexnum-1;i++){printf("%c-%c:权值为:%d\n",G.vexs[minedge[i].adjvex],G.vexs[minedge[i].endvex],minedge[i].lowcost);sum=sum+minedge[i].lowcost;}printf("最小生成树的权值为:%d",sum);}int main(){//主函数printf("*******************************************************\n");printf("* *\n");printf("* 最小生成树问题*\n");printf("* *\n");printf("*******************************************************\n");iGraph G;closedge minedge;CreateUDN(&G);//输入无向网printf("\n");MiniSpanTree(G,minedge);//求最小生成树PrintMinEdge(G,minedge);//输出最小生成树printf("\n");return 0;}四、调试分析编译环境为CodeBlocks。
《数据结构》课程设计--最小生成树问题

数据结构课程设计报告题目:最小生成树问题院(系):计算机工程学院学生姓名: XXX班级: XXX 学号: XXXXXXXXX起迄日期: 2015.07.13-2015.07.24指导教师: XXX XXX任务书最小生成树问题[问题描述]在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。
[设计要求](1)通过输入建立一无向网,存储结构可以采用多种;(2)要求分别采用普里姆算法和克鲁斯卡尔算法实现;(3)若以图形界面输出可以适当加分。
一、需求分析1.问题描述:该程序主要实现最小生成树功能,在给定的中国铁路网中,选择城市,生成最小生成树。
此外,改程序实现了城市介绍,指定城市到其它城市的最短距离,指定城市之间的最短距离等图论的基本操作。
直观、清晰的为用户提供全国铁路网的最基本情况。
该程序最具体的任务是最小生成树的实现,需要用到Prim算法和Kruskal算法实现。
输入指定的城市求出最小生成树,方便查询城市间的最短连通量。
另外添加了显示全国主要铁路网的功能,在跳出的界面,选择城市,程序会通过textBox控件显示选定的城市的相关介绍。
该程序实现了指定城市到其它城市之间的最短距离。
通过在地图上选择城市,程序通过Dijkstra算法计算出指定城市到其它城市之间的最短距离,并通过textBox控件显示,一目了然。
具有较强的人机和谐性。
还可以实现指定城市之间的最短路,输入两个指定的城市,通过Floyd算法求出选定城市间的最短距离。
并在图形界面上标注要经过的城市。
2.基本功能:(1)通过输入建立一无向网,存储结构采用了邻接矩阵。
(2)要求分别采用Prim算法和Kruskal算法实现,分别对应Prim.cs和Kruskal.cs。
(3)若以图形界面输出会适当加分。
3.附加功能:(1)城市的介绍,在输出的全国铁路网中,点击相应的城市会出现对该城市相应的介绍。
主要实现代码在Map.cs中。
(2)指定城市到其它城市的最短距离,在地图上点击指定城市,程序会显示指定城市到其它城市的最短距离。
数据课程设计报告--最小生成树

课程设计报告课程设计名称:数据结构课程设计课程设计题目:最小生成树研究院(系):专业:班级:学号:姓名:指导教师:完成日期:目录第 1 章概要设计 ....................................................................1.1题目介绍.........................................................................1.2功能要求.........................................................................1.3总体结构.........................................................................第 2 章详细设计 ....................................................................2.1 主函数的流程图 ................................................................. 2.2 权值位置判断流程图 .............................................................2.3创建邻接矩阵流程图 .............................................................2.4 最小生成树流程图................................................................ 第 3 章调试分析 ....................................................................第 4 章使用说明 ....................................................................参考文献 ............................................................................附录(程序清单) .................................................................第 1 章概要设计1.1题目介绍若要在 n 个城市之间建设通讯网络,只需要架设 n-1条路线即可。
最小生成树课程设计

最小生成树课程设计一、课程目标知识目标:1. 学生能够理解最小生成树的概念,掌握其定义和性质;2. 学生能够掌握两种常见的最小生成树算法:普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法;3. 学生能够运用最小生成树解决实际问题,如网络设计、电路设计等。
技能目标:1. 学生能够运用图论知识,分析并解决最小生成树问题;2. 学生能够编写和调试实现最小生成树的算法程序;3. 学生能够通过小组合作,共同探讨并解决最小生成树相关问题。
情感态度价值观目标:1. 学生通过学习最小生成树,培养对图论的兴趣,激发探索数学问题的热情;2. 学生在合作解决问题的过程中,学会沟通、协作,培养团队精神;3. 学生能够认识到数学知识在实际生活中的广泛应用,增强学习的积极性和主动性。
课程性质:本课程为计算机科学、信息技术等相关专业的高年级学生设计,旨在帮助学生掌握最小生成树的基本原理和算法,提高解决实际问题的能力。
学生特点:学生已经具备一定的图论基础,熟悉基本的算法和数据结构,具有一定的编程能力。
教学要求:通过讲解、示例、练习和小组讨论等形式,使学生掌握最小生成树的相关知识,提高编程实践能力和解决问题的能力。
同时,注重培养学生的团队合作精神和数学思维。
二、教学内容1. 最小生成树概念与性质- 定义、性质和判定条件- 最小生成树的应用场景2. 普里姆(Prim)算法- 算法原理与步骤- 代码实现与调试- 算法性能分析3. 克鲁斯卡尔(Kruskal)算法- 算法原理与步骤- 代码实现与调试- 算法性能分析4. 最小生成树算法比较与应用- 普里姆与克鲁斯卡尔算法的优缺点对比- 实际问题中的应用案例分析5. 小组讨论与练习- 分组讨论最小生成树相关算法及应用- 编写和调试最小生成树算法程序- 解决实际问题,如网络设计、电路设计等教学内容安排与进度:第一周:最小生成树概念与性质,普里姆算法原理与实现第二周:普里姆算法性能分析,克鲁斯卡尔算法原理与实现第三周:克鲁斯卡尔算法性能分析,最小生成树算法比较与应用第四周:小组讨论与练习,解决实际问题教材章节:《离散数学及其应用》第6章:图论《数据结构与算法分析》第9章:图论算法《计算机算法设计与分析》第4章:最小生成树与最短路径三、教学方法本课程将采用以下多样化的教学方法,以激发学生的学习兴趣和主动性:1. 讲授法:教师通过生动的语言、形象的比喻和具体的案例,讲解最小生成树的概念、性质和算法原理,使学生系统掌握理论知识。
最小生成树课程设计报告

《数据结构》课程设计报告构造可以使n个城市连接的最小生成树学校:平顶山学院设计题目(问题)描述和要求给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价。
二、系统分析与概要设计根据问题描述和要求,系统要求能够显示最小生成树的边,权值和得到的最小生成树的代价。
确定程序的数据结构(抽象数据类型)及“邻接矩阵的数据类型”、“临时数组的存放的数据类型”、邻接矩阵的创建等各模块定义。
做此设计,城市间的道路网用邻接矩阵来表示。
若两个城市之间不存在道路,则将相应的权值设置为自己定义的无穷大值。
此程序的目的是:显示最小生成树的边,权值和得到的最小生成树的代价。
因此该程序的指令是:输入城市数和道路数—>输入城市名—>输入道路信息—>执行prim算法—>输出最小生成树。
三、详细设计和编码1、邻接矩阵的数据类型的定义如下:typedef struct{ int no; /*顶点编号*/string name; /*顶点其他信息*/ } VertexType; /*顶点类型*/typedef struct{ int edges[MAXV][MAXV]; /*邻接矩阵*/int vexnum,arcnum; /*顶点数,弧数*/VertexType vexs[MAXV]; /*存放顶点信息*/ }MGraph;2、临时数组的存放的数据类型struct {int closest; // U集中的顶点序号int lowcost; // 边的权值} closedge[MAXV];int const INF=32767; /*INF表示∞*/3、prime算法实现:(原理见实验说明)void prime(MGraph g,int v){int lowcost[MAXV];int min;int closest[MAXV];int i,j,k;for(i=0;i<g.vexnum;i++){lowcost[i]=g.edges[v][i];closest[i]=v;}for(i=1;i<g.vexnum;i++){min=INF;for(j=0;j<g.vexnum;j++)if(lowcost[j]!=0&&lowcost[j]<min){min=lowcost[j];k=j;}printf("边(%d,%d)权为:%d\n",closest[k],k,min);lowcost[k]=0;for(j=0;j<g.vexnum;j++)if(g.edges[k][j]!=0&&g.edges[k][j]<lowcost[j]){lowcost[j]=g.edges[k][j];closest[j]=k;}}}4、邻接矩阵的创建void CreatMGraph(MGraph &M){int n,e;cout<<"输入定点数:";cin>>n;M.vexnum=n;cout<<"输入弧数:";cin>>e;M.arcnum=e;for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(i==j)M.edges[i][j]=0;elseM.edges[i][j]=INF;}}cout<<"输入边的权:(如1 2 3 表示点到点的权时)"<<endl;for(int i=0;i<2*e;i++){int x,y,z;cin>>x>>y>>z;M.edges[x][y]=z;}cout<<"输入点编号,名字:"<<endl;for(int i=0;i<n;i++){int No;string str;cin>>No>>str;M.vexs[i].name=str;M.vexs[i].no=No;}}int const MAXV=16。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
郑州工业应用技术学院课程设计说明书题目:关于最小生成树解决实际问题*名:***院(系):信息工程学院专业班级:16级计算机科学与技术1班学号:**********指导教师:***成绩:时间:2017 年12 月11日至2017 年 1 月7 日郑州工业应用技术学院课程设计任务书题目关于最小生成树解决实际问题专业、班级16级计算机科学与技术1班学号1601110026姓名__周红言主要内容:1、熟悉系统实现工具和上机环境。
2、本课题的可行性分析、开发计划,通过调研完成系统的需求分析。
简要叙述技术可行性、经济可行性和操作可行性等。
3.根据需求分析进行总体设计、数据库设计以及系统的设计与实现等。
基本要求:1.要用到图的先相关数据结构和求最小生成树的两种数据结构算法普里姆算法和克鲁斯卡尔算法,以及储存图的边和点的邻接矩阵。
2.学会使用Microsoft Visual C++ 6.0 集成开发环境。
主要参考资料:[1] 严蔚敏. 数据结构(C语言版)[M]. 北京:清华大学出版社,1997.[2] 谭浩强. C程序设计(第三版)[M]. 北京:清华大学出版社,2005.1.[3] 二霍红卫算法设计与分析〔」西安西安电子科技大学出版社,2005.113-127.完成期限:2017.12.2-2018.1.7指导教师签名:课程负责人签名:摘要最小生成树是数据结构中图的一种重要应用,在图中对于n个顶点的连通网可以建立许多不同的生成树,最小生成树就是在所有生成树中总的代价最小的生成树。
本课程设计是以邻接矩阵作为图的存储结构,分别采用Prim和Kruskal算法求最小生成树。
Kruskal算法和Prim算法是求最小生成树的常用算法它们分别适用于稠密图和稀疏图。
最小生成树的应用非常的广,如矿井通风设计和改造最优化方面以及如何搭建最短的网络线缆, 构建造价最低的通讯网络关键词:kruskal算法; prim算法;数据结构;最小生成树目录摘要 (I)目录 (II)项目背景........................................................................................ 错误!未定义书签。
第一章概述 (1)1.1 课程设计目的 (1)1.2 课程设计任务 (1)1.3基本功能.......................................................................... 错误!未定义书签。
1.4 模块分析 (1)第二章概要设计说明 (2)2.1需求分析 (2)2.2数据结构分析 (2)2.3设计思路 (2)2.4模块调用图 (3)2.5数据结构设计 (3)2.5.1 抽象数据类型 (3)2.5.2 方法描述 (5)2.5.3最小生成树的算法分析 (5)第三章详细设计说明 (10)3.1 主函数模块 (10)3.2 邻接表输出子模块 (10)3.3 邻接矩阵输出子模块 (10)3.4 创建邻接矩阵子模块 (10)3.5 创建邻接表子模块......................................................... 错误!未定义书签。
3.6 prim子模块 (10)3.7 kruscal子模块 (10)第四章调试分析与体会 (11)4.1实际完成情况说明 (11)4.2 出现的问题及解决方案 (11)4.3程序中可以改进的地方 (11)五、运行结果 (12)结束语 (13)参考文献 (14)第一章概述1.1 课程设计目的本课程设计的目的是了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法独立分析和解决问题的能力;训练用系统的观点和软件开发一般规范进行软件开发。
1.2 课程设计任务问题描述: 已知一个无向连通网表示n个城市以及城市间可能设置的通信线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边上的权值表示相应的代价。
对于n个点的连通网能建立许多不同的生成树,每一棵生成树都可以是一个通信网。
我们要选择一棵生成树,使总的耗费最小。
在n个城市之间建设网络,只需保证连同即可,求最经济的架设方法。
存储结构采用多种。
求解算法多种。
程序可利用克鲁斯卡尔算法或prim算法生成最小生成树。
1.3 模块分析主模块:用于生成界面和调用各个子模块。
Kruscal模块:以kruscal算法实现最小生成树。
Prim模块:以prim算法实现最小生成树。
邻接表模块:用邻接表方式存储图。
邻接表输出模块:输出邻接表。
邻接表矩阵模块:用邻接矩阵方式存储图。
第二章概要设计说明2.1需求分析1) 建立一个图,其存储方式可以采用邻接矩阵形式,需要定义两个数组,一个存储顶点,一个存储边,存储边的数组表明节点间的连通关系和边的权值;。
2) 利用普里姆算法和克鲁斯卡尔算法求网的最小生成树3) 按顺序输出生成树中各条边以及它们的权值。
2.2数据结构分析构造最小生成树的方法:最初生成树为空,即没有一个结点和一条边,首先选择一个顶点作为生成树的根,然后每次从不在生成树中的边中选择一条权值尽可能小的边,为了保证加入到生成树中的边不会造成回路,与该边邻接的两个顶点必须一个已经在生成树中,一个则不在生成树中,若网中有n个顶点(这里考虑的网是一个连通无向图),则按这种条件选择n-1边就可以得到这个网的最小生成树了。
详细的过程可以描述为:设置2个集合,U集合中的元素是在生成树中的结点,V-U集合中的元素是不在生成树中的顶点。
首先选择一个作为生成树根结点的顶点,并将它放入U集合,然后在那些一端顶点在U集合中,而另一端顶点在V-U 集合中的边中找一条权最小的边,并把这条边和那个不在U集合中的顶点加入到生成树中,即输出这条边,然后将其顶点添加到U集合中,重复这个操作n-1次。
2.3设计思路问题的解决分别采用普利姆算法以及克鲁斯卡尔算法。
1)普利姆算法就是先选择根,把它放到一个集合u中,剩余的顶点放在集合v中。
然后选择顶点与v中顶点之间权值最小的一条边,以此类推,如果达到最后一个则返回上一个顶点。
2)克鲁斯卡尔算法就是写出所有的顶点,选择权最小的边,然后写出第二小的,以此类推,最终要有一个判断是否生成环,不生成则得到克鲁斯卡尔的最小生成树。
2.4模块调用图2.5数据结构设计2.5.1 抽象数据类型ADT Graph{数据对象V:v是具有相同特征的数据元素的集合,成为顶点集。
数据关系R:R={VR}VR={<v,w>|v,w属于v且p(v,w)表示从v到w的弧,谓词p(v,w)定义了弧<v,w>的意义或信息}基本操作:1)Greate Graph(&G,V,VR)初始条件:v是图的顶点集,VR是图中弧的集合。
操作条件:按V和VR的定义构造图G。
2)LocateVex(G,u)初始条件:图G存在,u和G中顶点有相同的特征。
操作条件:若G中存在顶点U,则返回该顶点在图中的位置,则返回其它信息。
3)DestoryGraph(&u);初始条件:图G存在。
操作结果:销毁图G。
4)GetVex(G, v);初始条件:图G存在,v是图中某个顶点。
操作结果:返回v的值。
5)NextAdjVex(G, v, w);初始条件:图G存在,v是图中某个顶点,w是v的邻接顶点。
操作结果:返回v的(相对于w的)下一个邻接顶点。
若w是v的最后一个邻接点,则返回“空”。
6)BFSTraverse(G, Visit( ));初始条件:图G存在,Visit是顶点的应用函数。
操作结果:对图进行广度优先遍历。
在遍历过程中对每个顶点调用函数Visit一次且仅一次。
一旦visit( )失败,则操作失败。
存储结构Typedef struct{int adj;int weight;}AdjMatrix[MAX][MAX];Typedef struct{djMatrix arc;int vexnum, arcnum;} MGraph;流程图,如图所示:2.5.2 方法描述# delete int_max 10000/* 节点不可达的距离*/#define max 20/*数组最大长度*/Int creatMGraph_L(MGraph_L&G)//用邻接矩阵存储V oid 1jjzprint(MGraph_L G)//输出邻接矩阵0Int creatadj(algraph &gra,MGraph_L G)//用邻接表存储图V oid adjprint (algraph gra)//输出邻接表Int prim (int g[][max],int n)//prim算法V oid kruscal_are(MGraph_L G,algraph gra)//最小生成树kruscal算法2.5.3最小生成树的算法分析在该函数中主要有五段代码块,分别是主函数代码块、邻接矩阵定义模块代码、创建链接矩阵模块代码、最小生成树Prim算法及代价模块代码与最小生成树kruskal算法及代价模块代码,五段代码块分别有着不同的作用,共同满足了课题所需要实现的功能。
1)主函数模块代码algraph gra;MGraph_L G; int i,d,g[20][20];char a='a'; d=creatMGraph_L(G); vnode v;cout<<endl<<"注意:若该图为非强连通图(含有多个连通分量)时"<<endl<<"最小生成树不存在,则显示为非法值"<<endl<<endl;cout<<"…………………菜单……………………"<<endl<<endl;cout<<"0、显示该图的邻接矩阵……………………"<<endl;cout<<"1、最小生成树PRIM算法及代价…………………"<<endl;int s; char y='y';while(y='y') { cout<<"请选择菜单:"<<endl; cin>>s;switch(s){case 0: cout<<"邻接矩阵显示如下:"<<endl; ljjzprint(G); break;case 1: for(i=0;i!=G.vexnum;++i)for(intj=0;j!=G.vexnum;++j) g[i+1][j+1]=G.arcs[i][j].adj;cout<<"prim:"<<endl; prim(g,d); break; }cout<<endl<<"是否继续?y/n:"; cin>>y; if(y=='n') break; }}该主函数用一个循环语句,来执行其它的函数的功能。