数据结构课程设计报告(最小生成树完整版)
- 格式:doc
- 大小:387.00 KB
- 文档页数:21
《最小生成树的两种算法》数据结构课程设计报告题目:最小生成树的两种算法姓名:张芹芹学号:2008082238专业:计算机科学与技术班级:2008级(1)班指导老师:高攀二零一零年三月二十五日目录1.课程设计要求及实现目标 (3)2.程序运行环境 (3)3.程序的主要功能及模块设计与分析 (3)4.运行结果 (8)5.系统使用说明 (9)6.程序特色 (9)7.收获及体会 (10)8.参考书籍 (10)9.源程序 (11)一.课程设计要求及实现目标能够完成最小生成树的两种算法二、程序运行环境1.硬件环境微处理器(cpu):233MHZ Pentium或更高(或与之相当的处理器)内存:建议大于1 GB(RAM最小64MB,最大4GB)磁盘:5GB以上2.软件环境操作系统:Microsoft Windows 2003/xp使用软件: VC6系列三、程序的主要功能及模块设计与分析(一)模块主要功能介绍:此程序主要用于图问题中求最小生成树的运算,包含生成最小生成数的两种方法:PRIM算法和KRUSKAL算法。
PRIM算法包括图的矩阵存储,以及生成算法。
KRUSKAL算法包括:无向图的生成、按权值排序、以及生成算法。
矩阵存储:用于实现对图的存储PRIM生成算法:用于按照权值对图求最小生成树无向图的生成:用于构造吐的存储,能够利用KRUSKAL算法进行求解最小生成树按权值排序:用于对图中各边按照权值进行排序KRUSKAL算法:用于对图进行求解,生成最小生成树(二)、程序模块设计:(三)、程序模块流程图:(1)主函数void main()0 1 2(2)构造图的存储结构CreateES()(3)排序SortGE( )(4)图的矩阵存储CreateAM( )。
武夷学院课程设计报告课程名称:数据结构设计题目:最小生成树的应用学生班级:09计科2班学生姓名:蒋家权,陈相财,吴继伟,梁丽春指导教师:林丽惠完成日期:2011-1-19课程设计项目研究报告目录一、问题分析和任务定义....................................................................................... - 1 -二、实现本程序需要解决的问题如下................................................................... - 1 -三、测试数据........................................................................................................... - 2 -四、算法思想........................................................................................................... - 3 -五、模块划分........................................................................................................... - 4 -六、算法设计与分析............................................................................................... - 7 -七、源程序............................................................................................................. - 11 -八、测试数据......................................................................................................... - 14 -九、课程设计项目进度表及任务分配表及任务分配表..................................... - 16 -十、设计心得......................................................................................................... - 17 -十、参考书目......................................................................................................... - 18 -一、问题分析和任务定义在n个城市间建立通信网络,需架设n-1条线路。
二○一○届课程设计论文《算法与数据结构》二〇一〇年六月目录一、引言…………………………………………二、设计目的与任务………………………………1·课程设计的目的2·课程设计的任务三、设计方案………………………………………1·需求分析2·概要设计3·详细设计4·程序清单四、调试分析………………………………………五、测试结果………………………………………六、附录……………………………………………七、工作环境………………………………………八、参考文献……………………………《数据结构》课程设计——最小生成树问题一、引言《数据结构》是计算机科学与技术专业和信息系统专业的必修课之一,是一门综合的专业技术课。
本课程较系统的介绍了软件开发过程中常用的数据结构及相应的实现算法。
如线性表、栈、队列、树和二叉树,图、检索和排列等,并对性能进行分析和比较,内容非常丰富。
本课程设计我们要解决的是最小生成树问题。
要用到图的相关数据结构和最小生成树的克鲁斯卡尔算法,以及存储图的边和点的邻接矩阵。
本课程设计要解决的问题是构造连通图的最小生成树我们首先要做的是都造一个邻接表,用以存储图,然后我们要想好怎样利用克鲁斯卡尔算法构造最小生成树,把这个算法写入主程序,调试好程序,最后完成报告。
二、设计目的与任务1·课程设计的目的本课程设计是为了了解并掌握数据结构及算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的相关步骤;提高运用所学理论知识独立分析和解决问题的能力;训练用系统的观点和软件开发的一般规范进行软件开发。
2·课程设计的任务问题描述:若要在n个城市之间建设通信网络,只需架设n—1条线路即可。
如何以最低的经济代价建设这个通信网,是一个最小生成树的问题。
三、设计方案1·需求分析(1)利用克鲁斯卡尔算法求最小生成树;(2)实现教科书6.5节中抽象数据类型MFSet。
课程设计报告问题描述:已知一个无向连通网表示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条边就是需要求出的最小生成树的边。
数据结构实验报告-最小生成树(精选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,则返回该顶点在图中的位置;否则返回其他信息。
数据结构实验报告最小生成树实验目的:掌握最小生成树的概念和算法,培养分析和解决实际问题的能力。
实验内容:利用Kruskal算法求解带权无向连通图的最小生成树。
实验原理:最小生成树是指一个连通图的生成树,其中所有边的权值和最小。
最小生成树问题在图论中有着重要的应用,如网络设计、集成电路布线等领域。
本次实验使用Kruskal算法求解最小生成树。
Kruskal算法基于一个贪心的思想:每次选择权值最小的边,直到生成树中包含所有的节点。
具体算法如下:1.根据给定的连通图构造一个边的集合E,E中包含图中所有的边。
2.将E中的边按照权值从小到大排序。
3.依次遍历排序后的边,如果该边的两个节点不在同一个连通分量中,则选择该边,并将这两个节点合并到一个连通分量中。
4.重复第3步,直到生成树中包含所有的节点。
实验步骤及结果:1.根据给定的连通图构造边的集合E,并将E中的边按照权值从小到大排序。
2.初始化一个空的集合T作为最小生成树的边集合。
3.依次遍历排序后的边,如果该边的两个节点不在同一个连通分量中,则选择该边,并将这两个节点合并到一个连通分量中,同时将该边添加到集合T中。
4.重复第3步,直到生成树中包含所有的节点。
实验结果分析:通过Kruskal算法,可以得到带权无向连通图的最小生成树。
最小生成树具有多个优点,如能够保证连通、权值最小、无回路。
在实际应用中,最小生成树常常用于网络设计、集成电路布线等领域。
实验总结:通过本次实验,我掌握了最小生成树的概念和Kruskal算法的原理和实现方法。
实验中,我通过定义边的数据结构和构造边的集合,实现了Kruskal算法求解最小生成树。
通过实验,我深刻认识到数据结构在解决实际问题中的重要性和实用性。
最小生成树作为一种常用的图论算法,在实际应用中具有广泛的应用和重要的价值。
掌握了最小生成树的概念和算法,我相信能够在今后的学习和工作中更好地应用数据结构算法解决实际问题。
目录一、课题描述: (2)二、需求分析 (3)三、总体结构设计 (4)四、各子模块设计 (5)五、编程设计 (8)六、测试结果 (12)七、总结 (14)八、参考文献 (15)附录 (16)一、课题描述:设计一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权代表公路造价。
图中任一对城市都是连通的,用公路把所有城市联系起来,设计可使得工程的总造价最少。
二、需求分析根据课设题目要求,拟将整体程序分为三大模块。
此三个模块相互独立,没有嵌套调用的情况,以下是三个模块的大体分析:1. 建立一个图,其存储方式可以采用邻接矩阵形式,需要定义两个数组,一个存储城市,一个存储公路,存储公路的数组表明城市间的连通关系和公路的造价;。
2.利用kruskal算法求城市地图的最小生成树3.按父亲结点和子女结点集的形式输出生成树中各条边(公路)以及它们的权值(造价),公路总造价最小值。
三、总体结构设计功能模块图四、各子模块设计1.无向图的建立(初始化)2.用kruskal算法求最小生成树YYj=i+1YY3.用冒泡法排序YYY,vex…五、编程设计存储结构该函数包含三个结构体,即存储城市、存储公路和存储图的结构体,其结构体分别如下所示:1.顶点和边的存储表示用字符串name表示城市信息,num表示城市的序号。
struct node{char name[10];intnum;}vex[20];用整型begin和end表示公路的起点和终点,weight表示公路的造价。
typedefstruct{int begin;int end;int weight;}edge;2.图的邻接矩阵存储表示用整型adj表示城市间的关系,weight表示公路的造价。
typedefstruct{intadj;int weight;}AdjMatrix[MAX][MAX];用arc表示邻接矩阵,vexnum和arcnum表示图当前的城市数和公路数。
数据结构课程设计报告题目:最小生成树问题院(系):计算机工程学院学生姓名:班级:学号:起迄日期:指导教师:2011—2012年度第 2 学期一、需求分析1.问题描述:在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。
存储结构采用多种。
求解算法多种。
2.基本功能在n个城市之间建设网络,只需要架设n-1条线路,建立最小生成树即可实现最经济的架设方法。
程序可利用克鲁斯卡尔算法或prim算法生成最小生成树。
3.输入输出以文本形式输出最小生成树,同时输出它们的权值。
通过人机对话方式即用户通过自行选择命令来输入数据和生成相应的数据结果。
二、概要设计1.设计思路:因为是最小生成树问题,所以采用了课本上介绍过的克鲁斯卡尔算法和 prim算法两种方法来生成最小生成树。
根据要求,需采用多种存储结构,所以我选择采用了邻接表和邻接矩阵两种存储结构。
2.数据结构设计:图状结构: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>的意义或信息}基本操作:CreateGraph( &G, V, VR )初始条件:V是图的顶点集,VR是图中弧的集合。
操作结果:按V和VR的定义构造图G。
DestroyGraph( &G )初始条件:图G存在。
操作结果:销毁图G。
LocateVex( G, u )初始条件:图G存在,u和G中顶点有相同特征。
操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回其它信息。
GetVex( G, v )初始条件:图G存在,v是G中某个顶点。
操作结果:返回v的值。
PutVex( &G, v, value )初始条件:图G存在,v是G中某个顶点。
操作结果:对v赋值value。
数据结构课程设计目录一. 设计目的.................................................................................................... 错误!未定义书签。
二. 设计内容 (1)三.概要设计 (1)1、功能模块图 (1)2、各个模块详细的功能描述 (2)四.详细设计 (3)1.主函数和其他函数的伪码算法 (3)2、主要函数的程序流程图 (7)3、函数之间的调用关系图 (15)五.测试数据及运行结果 (15)1.正常测试数据及运行结果 (16)2、非正常测试数据及运行结果 (17)六.调试情况,设计技巧及体会 (18)七.参考文献 (19)八.附录:源代码 (19)一. 设计目的课程设计是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧。
能够在设计中逐步提高程序设计能力,培养科学的软件工作方法。
而且通过数据结构课程设计能够在下述各方面得到锻炼:1、能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,正确分析出数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。
2、提高程序设计和调试能力。
通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3、培养算法分析能力。
分析所设计算法的时间复杂度和空间复杂度,进一步提高程序设计水平。
二. 设计内容最小生成树问题:设计要求:在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。
存储结构采用多种。
求解算法多种。
三.概要设计1、功能模块图2、各个模块详细的功能描述※创建一个图:通过给用户信息提示,让用户将城市信息及城市之间的联系关系和连接权值写入程序,并根据写入的数据创建成一个图。
※功能选择:给用户提示信息,让用户选择相应功能。
※建立邻接矩阵:将用户输入的数据整理成邻接矩阵并显现在屏幕上。
数据结构实验最小生成树数据结构实验报告最小生成树问题一、问题描述:若要在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;}五(调试分析:将选边的过程输出来检验算法的正确性。
数据结构实验报告名称:最小生成树班级:122姓名:*****学号:***********指导老师:********一、设计目的与任务1。
1课程设计目的本课程设计的目的是了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法独立分析和解决问题的能力;训练用系统的观点和软件开发一般规范进行软件开发。
1。
2课程设计的任务问题描述:已知一个无向连通网表示n个城市以及城市间可能设置的通信线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边上的权值表示相应的代价.对于n个点的连通网能建立许多不同的生成树,每一棵生成树都可以是一个通信网。
我们要选择一棵生成树,使总的耗费最小。
二、设计方案2。
1需求分析(1)建立一个图,其存储方式可以采用邻接矩阵形式或者邻接表;(2)利用普利姆算法或者克鲁斯卡尔算法求出网的最小生成树;(3)输入各城市的数目以及各个城市之间的距离。
将城市之间的距离当做网中各点之间的权值。
按顺序输出生成树中各条边以及它们的权值。
2.2数据结构分析构造最小生成树的方法:最初生成树为空,即没有一个结点和一条边,首先选择一个顶点作为生成树的根,然后每次从不在生成树中的边中选择一条权值尽可能小的边,为了保证加入到生成树中的边不会造成回路,与该边邻接的两个顶点必须一个已经在生成树中,一个则不在生成树中,若网中有n个顶点(这里考虑的网是一个连通无向图),则按这种条件选择n—1边就可以得到这个网的最小生成树了。
详细的过程可以描述为:设置2个集合,U集合中的元素是在生成树中的结点,V—U集合中的元素是不在生成树中的顶点。
首先选择一个作为生成树根结点的顶点,并将它放入U集合,然后在那些一端顶点在U集合中,而另一端顶点在V-U集合中的边中找一条权最小的边,并把这条边和那个不在U集合中的顶点加入到生成树中,即输出这条边,然后将其顶点添加到U集合中,重复这个操作n-1次。
课程设计报告课程设计名称:数据结构课程设计课程设计题目:最小生成树研究院(系):专业:班级:学号:姓名:指导教师:完成日期:目录第 1 章概要设计 ....................................................................1.1题目介绍.........................................................................1.2功能要求.........................................................................1.3总体结构.........................................................................第 2 章详细设计 ....................................................................2.1 主函数的流程图 ................................................................. 2.2 权值位置判断流程图 .............................................................2.3创建邻接矩阵流程图 .............................................................2.4 最小生成树流程图................................................................ 第 3 章调试分析 ....................................................................第 4 章使用说明 ....................................................................参考文献 ............................................................................附录(程序清单) .................................................................第 1 章概要设计1.1题目介绍若要在 n 个城市之间建设通讯网络,只需要架设 n-1条路线即可。
#include<stdio.h>#include<stdlib.h>#define MAXLEAF 100#define INF 100000#define EDGENUMBER MAXLEAF*MAXLEAF/2typedef int EdgeType;typedef int VertexType;typedef struct{EdgeType val[MAXLEAF][MAXLEAF];VertexType ves[MAXLEAF];int v;int e;}MGraph;typedef struct{int vex1,vex2;int w;}kedge;void creat_MGraph(MGraph *M){int i,j,k;int w;printf("请输入图的顶点个数及边数:\n");scanf("%d%d",&(M->v),&(M->e));printf("请依次填充顶点信息:\n");for(i=0;i<M->v;i++)scanf("%d",&(M->ves[i]));for(i=0;i<M->v;i++)for(j=0;j<M->v;j++)if(i==j) M->val[i][j]=0;else M->val[i][j]=INF;printf("请依次输入图的边两个顶点顶点的权值:(格式:a b c)\n");for(k=0;k<M->e;k++){scanf("%d%d%d",&i,&j,&w);M->val[i-1][j-1]=w;M->val[j-1][i-1]=w;}}VertexType kruskal(MGraph M){int tag[MAXLEAF];kedge Ke[EDGENUMBER];int i,j;VertexType length=0;int n=0;for(i=0;i<M.v;i++) tag[i]=i;for(i=0;i<M.v;i++)for(j=i+1;j<M.v;j++)if(M.val[i][j]!=INF){Ke[n].vex1=i;Ke[n].vex2=j;Ke[n++].w=M.val[i][j];}kedge temp;for(i=0;i<n-1;i++)for(j=0;j<n-i-1;j++)if(Ke[j].w>Ke[j+1].w){temp=Ke[j+1];Ke[j+1]=Ke[j];Ke[j]=temp;}for(i=0;i<n;i++){int first,second;first = tag[Ke[i].vex1];second = tag[Ke[i].vex2];if(first!=second){length+=Ke[i].w;printf("%d->%d: %d\n",Ke[i].vex1,Ke[i].vex2,Ke[i].w);tag[Ke[i].vex2]=first;for(j=0;j<M.v;j++){if(second==tag[j])tag[j]=first;}}}return length;}int main(){MGraph M;int len;creat_MGraph(&M);printf("最小生成树:\n");len=kruskal(M);printf("最小成本:%d",len);return 0;}。
(此文档为word格式,下载后您可任意编辑修改!) 课程设计报告课程设计名称:数据结构课程设计课程设计题目:最小生成树Kruskal算法院(系):专业:班级:学号:姓名:指导教师:目录1 课程设计介绍 (1)1.1课程设计内容 (1)1.2课程设计要求 (1)2 课程设计原理 (2)2.1课设题目粗略分析 (2)2.2原理图介绍 (4)2.2.1 功能模块图 (4)2.2.2 流程图分析 (5)3 数据结构分析 (11)3.1存储结构 (11)3.2算法描述 (11)4 调试与分析 (13)4.1调试过程 (13)4.2程序执行过程 (13)参考文献 (16)附录(关键部分程序清单) (17)1 课程设计介绍1.1 课程设计内容编写算法能够建立带权图,并能够用Kruskal算法求该图的最小生成树。
最小生成树能够选择图上的任意一点做根结点。
最小生成树输出采用顶点集合和边的集合的形式。
1.2 课程设计要求1.顶点信息用字符串,数据可自行设定。
2.参考相应的资料,独立完成课程设计任务。
3.交规范课程设计报告和软件代码。
2 课程设计原理2.1 课设题目粗略分析根据课设题目要求,拟将整体程序分为三大模块。
以下是三个模块的大体分析:1.要确定图的存储形式,通过对题目要求的具体分析。
发现该题的主要操作是路径的输出,因此采用边集数组(每个元素是一个结构体,包括起点、终点和权值)和邻接矩阵比较方便以后的编程。
2.Kruskal算法。
该算法设置了集合A,该集合一直是某最小生成树的子集。
在每步决定是否把边(u,v)添加到集合A中,其添加条件是A∪{(u,v)}仍然是最小生成树的子集。
我们称这样的边为A 的安全边,因为可以安全地把它添加到A中而不会破坏上述条件。
3.Dijkstra算法。
算法的基本思路是:假设每个点都有一对标号(d j,p j),其中d是从起源点到点j的最短路径的长度(从顶点到其本身的最短路径是零路(没有弧的路),其长度等于零);p j则是从s到j的最短路径中j点的前一点。
HUNAN UNIVERSITY 课程实习报告
题目:最小生成树
学生姓名:
学生学号:
专业班级:
指导老师:
完成日期:
一、需求分析
若要在n个城市之间建设通信网络,只需要架设n-1条线路即可。
如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题
二、概要设计
抽象数据类型
用数组将边的距离及权值进行存储并排序。
算法的基本思想
构造生成树的网一定是无向网。
并设顶点数不超过30个,边权值为小于100的整数。
根据克鲁斯卡尔算法的特点,为便于选择选择权值小的边,存储结构不选用邻接矩阵和邻接表,而是可以用存储边(带权)的数组表示图。
程序的流程
程序由三个模块构成:
(1)从文件中读入图的信息。
(2)利用克鲁斯卡尔算法求网的最小生成树。
(3)以文本形式生成树中各条边以及他们的权值。
三、
四、详细设计
算法的具体步骤
先将用户的输入的顶点和边的数量,根据这些信息构建出图的结构,最后对边的权值进行排序。
输入和输出的格式
输入:
输入顶点和边的个数及顶点之间的权值。
输出:
输出最小生成树的序列。
五、测试结果
六、实验心得
实验的时候不是这个结果啊,可能是哪个环节出了错误,但是思想没有问题的,通过本次实验学会了用C++实现最小生成树。
友情提示:范文可能无法思考和涵盖全面,供参考!最好找专业人士起草或审核后使用,感谢您的下载!。
《数据结构》课程设计报告构造可以使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。
武夷学院课程设计报告课程名称:数据结构设计题目:最小生成树的应用学生班级:09计科2班学生姓名:蒋家权,陈相财,吴继伟,梁丽春指导教师:林丽惠完成日期:2011-1-19课程设计项目研究报告目录一、问题分析和任务定义....................................................................................... - 1 -二、实现本程序需要解决的问题如下................................................................... - 1 -三、测试数据........................................................................................................... - 2 -四、算法思想........................................................................................................... - 3 -五、模块划分........................................................................................................... - 4 -六、算法设计与分析............................................................................................... - 7 -七、源程序............................................................................................................. - 11 -八、测试数据......................................................................................................... - 14 -九、课程设计项目进度表及任务分配表及任务分配表..................................... - 16 -十、设计心得......................................................................................................... - 17 -十、参考书目......................................................................................................... - 18 -一、问题分析和任务定义在n个城市间建立通信网络,需架设n-1条线路。
求解如何以最低经济代价建设此通信网,这是一个最小生成树问题。
要求:(1)利用普利姆算法求网的最小生成树;(2)输出生成树中各边及权值。
二、实现本程序需要解决的问题如下(1)、如何选择存储结构去建立一个带权网络。
(2)、如何在所选存储结构下输出这个带权网络。
(3)、如何实现PRIM算法的功能。
(4)、如何从每个顶点开始找到所有的最小生成树的顶点。
(5)、如何输出最小生成树的边及其权值。
此问题的关键在于如何实现PRIM算法,实现的过程中如何得到构成最小生成树的所有顶点,此外输出也是一个关键问题所在,在此过程中经过了多次调试。
首先我们对问题进行大致的概要分析:这个问题主要牵涉到通过PRIM的基本算法思想实现程序所要求的功能,该算法的主要思想是:假设N=(V,{E})是连通网,TE是N上最小生成树中边的集合。
算法从U={u0}( u0∈V),TE={}开始,重复执行下述操作:在所有u∈U,v∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。
此时TE中必有n-1条边,则T=(V,{E})为N 的最小生成树。
问题的输入数据的格式为:首先提示输入带权网络的顶点边数,我定义的为整形数据型,然后输入每一条边的信息,即边的两个顶点以及权值,是十进制整数类型,这样我们就建立一个带权网络,并用邻接矩阵来存储,生成一个方阵显示出来。
问题的输出数据格式为:输出是以邻接矩阵存储结构下的方阵,以及从不同顶点开始省城的最小生成树。
题目要求以及达到目标:题目要求用普利姆算法实现任意给定的网和顶点的所有最小生成树,并且输出各边的权值。
三、测试数据第一组顶点数(vertices)、边数(edge):2、1起始节点(starting)、下个节点(terminal)、权值(weights):1、2、5 ,预测结果<1,2>5第二组顶点数(vertices)、边数(edge):3、3起始节点(starting)、下个节点(terminal)、权值(weights):1、2、41、3、52、3、6预测结果<1,2>4、<1,3>5第三组顶点数(vertices)、边数(edge):4、5 ,起始节点(starting)、下个节点(terminal)、权值(weights):1、2、31、3、41、4、62、4、73、4、5预测结果<1,2>3、<1,3>4、<1,4>6四、算法思想Prim算法求最小生成树的主要思想此算法是普利姆与1957年提出的一种构造最小生成树的算法,主要思想是:假设N=(V,{E})是连通网,TE是N上最小生成树中边的集合。
算法从U={u0}( u0∈V),TE={}开始,重复执行下述操作:在所有u∈U,v∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。
此时TE中必有n-1条边,则T=(V,{E})为N的最小生成树。
对于最小生成树问题最小生成树是指在所有生成树中,边上权值之和最小的生成树,另外最小生成树也可能是多个,他们之间的权值之和相等。
五、模块划分(1)预处理#include <stdio.h>#include <graphics.h>#define inf 9999#define max 40#define linelenght 77(2)普里姆算法void prim(int g[][max],int n) /* prim的函数*/{int lowcost[max],closest[max];int i,j,k,min;for(i=2;i<=n;i++) /* n个顶点,n-1条边*/ { lowcost[i]=g[1][i]; /* 初始化*/closest[i]=1; /* 顶点未加入到最小生成树中*/}lowcost[1]=0; /* 标志顶点1加入U集合*/ for(i=2;i<=n;i++) /* 形成n-1条边的生成树*/ {min=inf;k=0;for(j=2;j<=n;j++) /* 寻找满足边的一个顶点在U,另一个顶点在V的最小边*/if((lowcost[j]<min)&&(lowcost[j]!=0)){min=lowcost[j];k=j;}printf("(%d,%d)%d\t",closest[k],k,min);lowcost[k]=0; /* 顶点k加入U */for(j=2;j<=n;j++) /* 修改由顶点k到其他顶点边的权值*/if(g[k][j]<lowcost[j]){lowcost[j]=g[k][j];closest[j]=k;}printf("\n");}}(3)输出分割线int priline(int h) /* 输出一条分割线*/{int g;printf("\n|");for(g=0;g<h;g++)printf("*");printf("|\n");}(4)提示错误信息int error() /* 提示错误信息*/{printf("\n\n|************************E*R*R*O*R************************|\ n");printf("Input errors or Data overflow please re-enter\n\n");fflush(stdin); /* 清除缓存*/}(5)建立无向图int adjg(int g[][max]) /* 建立无向图*/{int n,e,i,j,k,v1=0,v2=0,weight=0;printf("Input the number of vertices, number of the edge:");scanf("%d,%d",&n,&e);while(e<=0||e>=n*(n-1)||n>=max){error();printf("Input the number of vertices, number of the edge:");scanf("%d,%d",&n,&e);}for(i=1;i<=n;i++)for(j=1;j<=n;j++)g[i][j]=inf; /* 初始化矩阵,全部元素设为无穷大*/for(k=1;k<=e;k++){printf("Input the %d on the edge of the starting point, terminal, weights:",k);scanf("%d,%d,%d",&v1,&v2,&weight);while(v1==v2||v1>n||v2>n||v1<1||v2<1){error();printf("Input the %d on the edge of the starting point, terminal,weights:",k);scanf("%d,%d,%d",&v1,&v2,&weight);}g[v1][v2]=weight;g[v2][v1]=weight;}return(n);} /* 返回节点个数n */(6)输出无向图的邻接矩阵void pri(int g[][max],int n) /* 输出无向图的邻接矩阵*/ {int i,j;for(i=0;i<=n;i++)printf("%d\t",i);for(i=1;i<=n;i++){printf("\n%d\t",i);for(j=1;j<=n;j++) /* 输出边的权值*/{if(g[i][j]==inf) printf("%c\t",'\354');else printf("%d\t",g[i][j]);}}printf("\n");}(7)主函数模块void main() /* 主函数*/{int g[max][max],n;priline(linelenght);n=adjg(g);priline(linelenght);priline(linelenght);printf("Input the adjacency matrix without directed graph:\n");pri(g,n);printf("\n");printf("Minimum spanning tree structure:\n");prim(g,n);getch();}六、算法设计与分析(1)关于带权网络的存储形式要实现对于任意给定带权网络和顶点,运用PRIM基本算法思想求解所有的最小生成树的运算。