欢迎来到天天文库
浏览记录
ID:22608321
大小:430.55 KB
页数:26页
时间:2018-10-30
《数据结构实验报告—管道铺设问题》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、《计算机软件技术基础》实验报告I—数据结构实验三:管道铺设施工的最佳方案问题一、问题描述1.实验题目:需要在某个城市n个居民小区之间铺设煤气管道,则在这n个居民小区之间只需要铺设n-1条管道即可。假设任意两个小区之间都可以铺设管道,但由于地理环境不同,所需要的费用也不尽相同。选择最优的方案能使总投资尽可能小,这个问题即为求无向网的最小生成树。2.基本要求:在可能假设的m条管道中,选取n-1条管道,使得既能连通n个小区,又能使总投资最小。每条管道的费用以网中该边的权值形式给出,网的存储采用邻接表的结构。3.测试数据:使用下图给出的无线
2、网数据作为程序的输入,求出最佳铺设方案。右侧是给出的参考解。图1小区煤气管道铺设网及其参考解4.输入输出:从键盘或文件读入上图中的无向网,以顶点对(i,j)的形式输出最小生成树的边。二、需求分析1.本程序所能达到的基本可能:本程序用无向网表示各小区之间的管道铺设情况,结点表示小区位置,边表示铺设的管道,边的权值表示各段的费用。采用邻接表存储,输入无向网数据创建邻接表,通过普利姆算法求出最小生成树,即是最佳铺设方案。2.输入输出形式及输入值范围:根据提示输入总的边数,结点数。再根据提示输入各结点的信息即结点的名称,输入边的信息,即边的
3、两个端点和该边的权值。输入后成功创建邻接表,自动输出所建立的邻接表和普利姆算法求出的最小生成树。3.测试数据要求:使用下图给出的无线网数据作为程序的输入,求出最佳铺设方案。右侧是给出的参考解。输入结点数和边数:915根据提示分别输入九个结点的名称:ABCDEFGHI输入边的信息,即两个端点的名称及该边的权值:(AB32.8);(BC5.9);(CD21.3);(DE67.3);(AC44.6);(AH12.1);(AI18.2);(HI8.7);(HG52.5);(CG56.4);(CE41.1);(EF85.6);(DF98.7)
4、;(IF79.2);(EG10.5)输入完毕直接输出“建立的图邻接表表示为:0->8->7->2->1->2->0->2->4->6->0->3->1->3->5->4->2->4->6->5->2->3->5->8->3->4->6->4->2->7->7->6->8->0->8->5->7->0”直接输出应用prime算法,得到的最小生成树的结果,用结点字母表示三、概要设计为了实现上述功能,该程序以邻接表存储的无向图模拟居民住宅的分布和住宅之间的管道,通过普利姆算法求最小生成树来求解管道最小花费。因此需要邻接表这一抽象数据类型来
5、表示无向图。还需要普利姆算法求最小生成树。1.邻接表抽象数据类型定义ADT ALGraph{ 数据对象:D={ai,bi,ci
6、ai∈AdjList,bi∈int,ci∈int),i=1,2...,n,n≥0}:数据关系:R=∅基本操作:create(ALGraph*G)//建立无向图的邻接表存储voidprime(ALGraph*G,intfrom)//用普利姆算法求最小生成树}ADT ALGraph2.ADT的c语言形式说明:typedefstruct{AdjListadjlist;//邻接表intn,e;//顶点数和边数}AL
7、Graph;//ALGraph是以邻接表方式存储的图类型voidcreate(ALGraph*G)//建立无向图的邻接表存储voidprime(ALGraph*G,intfrom)//用普利姆算法求最小生成树3.本程序保护模块:主函数模块图模块4.普利姆算法分析(1)普利姆算法思想:普利姆算法的思想是:在图中人去一个定点k0作为开始点,令U={k0},W=V-U,其中V为图中所有顶点集,然后找一个顶点在U中,另一个顶点在w中的边中最短的一条,找到后,将该边作为最小生成树的树边保存起来,并将该边顶点全部加入U集合中,并从W中删除这些顶
8、点,然后重新调整U中顶点到W中顶点的距离,使之保持最小,再重复此过程,直到W为空集。(2)算法过程描述:在图G=(V,E)(V是顶点,E是边)中,从集合V中任取一个顶点,如k0放入集合U中,这时,U={k0},集合T(E)为空。从k0出发寻找与U中顶点相邻权值最小的边的另一顶点k1,并使k1加入U。即U={k0,k1},同时将该边加入集合T(E)中。重复(2),直到U=V为止。这时T(E)中有n-1条边,T=(U,T(E))就是一一颗最小生成树。5.主程序流程及其模块调用关系:(1)主程序流程:先提示用户输入相关数据:节点数,边数,
9、各结点名称,各边两端名称和边的权值。创建邻接表存储无向图并输出这一邻接表。用普利姆算法求最小生成树:访问各节点,从已经访问过的节点和未访问过的节点组成的所有边中挑出权重最小的一条边放入邻接表EdgeNode*minEdge中。输出这个
此文档下载收益归作者所有