图论 最小生成树在城市交通建设中的应用_第1页
图论 最小生成树在城市交通建设中的应用_第2页
图论 最小生成树在城市交通建设中的应用_第3页
图论 最小生成树在城市交通建设中的应用_第4页
图论 最小生成树在城市交通建设中的应用_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、最小生成树在城市交通建设中的应用姓 名 XX 学 号 S100203029 专 业 计算机应用技术 2010年12月414目录摘 要I绪论12 有关最小生成树的概念23 prim算法介绍34 系统设计及其应用5一、系统设计5二、最小生成树应用65 总结9参考文献10附件:11最小生成树在城市交通建设中的应用摘 要连通图广泛应用于交通建设,求连通图的最小生成树是最主要的应用。比如要在n个城市间建立通信联络网,要考虑的是如何保证n点连通的前提下最节省经费,就应用到了最小生成树。求图的最小生成树有两种算法,一种是Prim(普里姆)算法,另一种是Kruskal(克鲁斯卡尔)算法。本文通过将城市各地点转

2、换成连通图,再将连通图转换成邻接矩阵。在Microsoft Visual C+上,通过输入结点和权值,用普里姆算法获得权值最小边来得到最小生成树,从而在保证各个地点之间能连通的情况下节省所需费用。本文从分析课题的题目背景、题目意义、题目要求等出发,分别从需求分析、总体设计、详细设计、测试等各个方面详细介绍了系统的设计与实现过程,最后对系统的完成情况进行了总结。关键字:PRIM算法、最小生成树、邻接矩阵、交通建设绪论中国国际工程咨询公司交通业务部主任周晓勤指出,“以前的各专业规划主要是按照本行业交通发展的需求进行研究和规划的,在交通设施总量不足、基本网不完善的时候,互相之间的矛盾并不突出。但随着

3、多种运输方式设施建设的快速发展,各行业交通网络的逐步完善,多种运输方式网络之间的叠加,难免显现出各种运输方式在通道和枢纽衔接上的不协调。其结果是,资源浪费,效率低下,使用不便利。而综合交通网发展规划的颁布有利于运输整体结构的调整,资源节约和集约利用,对于交通运输业的可持续发展具有重要和深远的意义。”在社会主义建设时期,各个城市建设问题尤其是交通建设尤为重要。在保证各个城市能互相连通的情况下,怎么保证建设公路,怎么建设最省钱是建设工程公司所需考虑的重大情况。从而能节省更多的钱来投资其他地方建设,如农村交通建设。各个农村交通建设好之后,则可再根据将农村作为一个结点和其它农村再次运用最小生成树。最小

4、生成树则能有效的解决此问题。例如,以尽可能低的总价建设若干条高速公路,把n个城市联系在一起。普里姆算法通过寻找无向图中权值最小的边,并且将其组合成最小生成树,同时将最小生成树以点集的形式输出,便于观察。根据课程设计任务书要求,本系统开发主要完成以下功能和性能。(1) 输入无向图的方式要尽量简单方便。(2) 要能够形象方便的观察无向图的结构。(3) 要能够形象地演示PRIM算法求最小生成树的过程。本文第二章主要介绍图和最小生成树、邻接矩阵等概念。第三章主要介绍prim算法。第四章进行系统设计与调试及其在交通建设中的应用。2 有关最小生成树的概念最小生成树:连通加权图里权和最小的生成树称为最小生成

5、树。从最小生成树定义看主要先了解图、树及生成树。本文中最小生成树在计算机中存储方法是应用邻接矩阵的形式存储。故也应了解邻接矩阵的定义。定义一(图):图是有一个非空的顶点集合和一个描述顶点之间的关系即边的集合组成。它可以形式化的定义为:G=(V,E)V= | VertexTypeE=<,>|,VP(,) 其中,G表示一个图,V是图G中顶点的集合,E是V中顶点偶对的有限集,这些顶点偶对称为边,VertexType是用于描述顶点类型,集合E中P(,)的含义是:对有向图来说用“<>”表示,对无向图来说用“()”表示,即从到 两个顶点之间存在边。定义二(树):树包含n(

6、n>=0)个节点。当n=0时表示为空树。其定义如下:T=(D,R)其中,D为树中节点的有限集合,关系R满足一下条件:1) 有且仅有一个节点k0属于D,它对于关系R来说没有前趋节点,结点k0称作树的根结点。2) 除根结点k0之外,D中的每个结点仅有一个前趋结点,但可以有过个后继结点。3) D中可以有多个终端结点。即除根结点无父结点,其余各结点都有一个父结点和n(n>=0)个子结点。图的矩阵表示,本文中只用到了邻接矩阵,故在这只提出邻接矩阵的定义,及其图在邻接矩阵中的表示。设图 A = (V, E)是一个有 n 个顶点的图, 图的邻接矩阵是一个二维数组 A.edgenn,用来存放顶点的

7、信息和边或弧的信息。定义三(邻接矩阵(Adjacency Matrix):是表示顶点之间相邻关系的矩阵。设G=(V,E)是一个图,其中V=v1,v2,vn。G的邻接矩阵是一个具有下列性质的n阶方阵:(本文主要为无向图的邻接矩阵)(1) 无向图的邻接矩阵是对称的;有向图的邻接矩阵可能是不对称的。(1)无向图的邻接矩阵中第i行第j列表示i结点到j结点的度即权值,可以表示为某一具体应用的数据。也表示i结点是否与j结点连通。定义四(生成树):如果T是G的一个生成子图又是一棵树,则称T是图G的一棵生成树。3 prim算法介绍最小生成树的两个著名算法:prim算法和克鲁斯卡尔算法2 ,本文应用的是prim

8、算法。则克鲁斯卡尔算法则不进行描述了。Prim算法的基本思想:首先,选择带最小的边,把它放进生成树里,相继添加带权最小的边,这些边与已在树立的顶点相关联,并且不与已在数理的边形成圈,当已经添加了n-1条边为止。PRIM算法介绍:设图中顶点的全集为V, U中存放已选中过的点,用数据结构closedge存放选择需要的数据,先把下标0对应点放入U中, closedgei.uxiabiao=0,(因为U中只有下标0这一个点), closedgei.lowcost中存放其他点到下标为0的点的权,closedge0.lowcost=0;表示下标为0的点已在U中了。在closedge按顺序找到最先不在U中,

9、且与U中点直接相连的点,把此边的权赋给min,用擂台式比较法选出closedgej.lowcost中最小的,此时min中存放的是最小值所在下标,也就是下一个要放入U中的点的下标。输出选中的这条边,它是最小生成树中的一条边。因为U中又加入了一个点,所以要修改closedgei.lowcost的值,比较新选中点与V-U中点的权和原来的closedgei.lowcost,取小的那个存入。然后继续如上的选择,循环vexnum-1次,就选出了最小生成树中的vexnum-1条边。本程序采用数组存储结构进行存储,把第一个点所到的边记录下来,然后把权值最小的边存入数组,同时将刚才所存边的的终点作为起点再次记录

10、该点所到的边,并记录权值最小的边存入数组,这个过程中,已经被访问的点不再访问。知道最后所有的权值最小的边全部输出。这就是PRIM算法求最小生成树。Prim算法有两种形式,其伪代码如下:算法一:procedure Prim; beginT:=;U:=1;while U<>V dobegin(u,v):= uU且vV-U的最小权边;T:=T(u,v);U:=Uv;end;end;改进的prim算法2如下:procedure Prim(var G:adj_matrix;size:integer);G为图,size为图的节点数目;注意:假设输入的图是连通图varlowcost:array

11、1.maxsize of integer;used:array 1.maxsize of boolean;closeset:array1.maxsize of integer;i,j,k,min:integer;beginfor i:=2 to size do 初始化,此时U只含有顶点1beginlowcosti:= G1,i;closeseti:=1;usedi:=false;end;used1:=true;for i:=2 to size dobeginmin:=maxint;j:=i;for k:=2 to size do 用选择法寻找顶点分别在V-U与U中权最小的边if (not us

12、edk)and(lowcostk beginmin:=lowcostk;j:=k;end;writeln(fout,'(',closesetj,',',j,')'); 输出找到的最小生成树的一条边,此处可根据情况修改usedj:=true; 将j填加到Ufor k:=2 to size do 调整lowcost和closesetif (not usedk)and(Gj,k beginlowcostk:=Gj,k;closesetk:=j;end;end;end;4 系统设计及其应用一、系统设计数据信息以结构体【3】【4】和数组形式储存,结点的信息

13、结构体定义如下:struct graphchar tnode;char hnode;double quanzhi;gr100;char node50=" "图的存储结构为:#define INFINITY INT_MAX /最大值#define MAX_VERTEX_NUM 20 /最多的顶点个数typedef enumDG,DN,UDG,UDN GraphKind; /有向图、有向网、无向图、无向网typedef struct ArcCell VRType adj; /顶点关系类型:图:0、1 网:权值 InfoType *info;/该弧相关信息指针ArcCell,Ad

14、jMaTrixMAX_VERTEX_NUM MAX_VERTEX_NUM;typedef struct VertexType vexsMAX_VERTEX_NUM;/顶点向量 AdjMaxtrix arcs; /邻接矩阵 int vexnum,arcnum; /顶点数和弧或边数 GraphKind kind; /图的种类标志 Mgraph;Prim算法: void prim(mgraph g,int k,int n) /核心算法Prim算法实现函数int i,j,min,p; /定义整型变量i,j用于循环 min和p分别用于临时存放最小权值及其下标struct /定义型类型数据closedge

15、用于临时存放下标和最小边int adjvex;int lowcost;closedge100; for(i=1;i<=n;i+) /初始化辅助数组if(i!=k) closedgei.adjvex=k;closedgei.lowcost=g.vki;closedgek.lowcost=0; /将节点加入生成树中for(i=1;i<n;i+) /循环比较最小权值且将最小权值的点加入生成树中并打印输出p=1; /初始化p min=maxvalue; /初始化最小权值for(j=1;j<=n;j+) /循环n次比较最小权值if(closedgej.lowcost!=0&&a

16、mp;closedgej.lowcost<min) /当前节点不在已生成树中且权值最下min=closedgej.lowcost; /替换最小权值为当前节点的权值p=j; /记录该节点下标printf("%d_ _%dn",closedgep.adjvex,p,min); /打印最小的权值的下标和最小边closedgep.lowcost=0; /将该节点加入生成树中 for(j=1;j<=n;j+) /刷新临时存放空间if(g.vpj) < (closedgej.lowcost)closedgej.lowcost=g.vpj; /赋值最小边closedge

17、j.adjvex=p; /赋值最小边对应下标 二、最小生成树应用C编写的程序测试【5】数据:假设如图V2V3V5V7V1V6V4343574151636结果应该如下V3V5V7V1V6V45113V223程序运行如图:5 总结该算法循序渐进,通过数组的灵活应用,构造无向连通图并最终轻松实现了生产最小生成树的目的。实验表明最小生成树能具体应用到交通建设上去。这个程序还有待开发,将其运用到交通建设上,能起到节约资源和时间的作用,并且也是交通建设发展必要的工具。参考文献【1】数据结构与算法教程第二版,李春葆等,清华大学出版社。【2】图论及其算法,殷剑宏等,中国科学技术大学出版社。【3】C语言程序设计

18、(第三版),谭浩强,清华大学出版社。【4】数据结构(C语言版),严蔚敏 吴伟民,清华大学出版社。【5】c语言习题集与上机指导第二版,谭浩强,高等教育出版社。附件:程序代码:#include "stdio.h"#define maxnum 10#define maxvalue 88typedef struct /定义存放各节点间边的权值的二位数组为新的数据类型可称为图int vmaxvaluemaxvalue; mgraph; /该数据类型用标识符mgraph表示mgraph input(int n) /数据输入函数用于输入各节点间边的权值mgraph x; /定义x为mgr

19、aph类型while(n<=0|n>maxnum) /控制输入出错重新执行printf("输入有误,请重新输入:"); scanf("%d",&n);for(int i=1;i<=n;i+) /双层循环控制每个节点到其他各节点的权值for(int j=0;j<=n;j+) int temp; /定义临时变量用于存放输入权值便于接下的过滤操作if(i=j) /各节点到自身的权重赋为0x.vij=0; else if(i<j) /赋值其他各点到比其大的下标的节点printf("请输入节点%d到节点%d的权:&q

20、uot;,i,j);scanf("%d",&temp); /将输入临时存放在tempwhile(temp=0|temp<-1) /过滤输入数据printf("输入有误,请重新输入:n");printf("请输入%d到%d的权:",i,j);scanf("%d",&temp);if(temp>0) /将符合要求数据赋值给tempx.vij=temp; else /temp=-1时将权重赋值最大值88 x.vij=maxvalue;else /i>j由于权重是对称的即呈上三角或下三角分

21、布故只需将i,j对换即可x.vij=x.vji;printf("n");return x; /返回图xvoid print(mgraph g,int n) /打印函数int i,j; /定义整型i,jprintf(" "); /打印美观需要for(i=1;i<=n;i+) printf("%2d ",i); printf("n");for(i=1;i<=n;i+) /双层循环按矩阵方式打印输出各节点间权值printf("%d ",i); for(j=1;j<=n;j+)prin

22、tf("%2d ",g.vij); printf("n");void prim(mgraph g,int k,int n) /核心算法Prim算法实现函数int i,j,min,p; /定义整型变量i,j用于循环 min和p分别用于临时存放最小权值及其下标struct /定义型类型数据closedge用于临时存放下标和最小边int adjvex;int lowcost;closedgemaxnum; for(i=1;i<=n;i+) /初始化辅助数组if(i!=k) closedgei.adjvex=k;closedgei.lowcost=g.vki;closedgek.lowcost=0; /将节点加入生成树中for(i=1;i<n;i+) /循环比较最小权值且将

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论