1 / 11
文档名称:

最小生成树及其算法.doc

格式:doc   大小:423KB   页数:11页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

最小生成树及其算法.doc

上传人:glfsnxh 2020/8/30 文件大小:423 KB

下载得到文件列表

最小生成树及其算法.doc

文档介绍

文档介绍:《离散数学》大作业论文题目:最小生成树及其算法院系:电子工程学院专业:智能科学与技术学号:姓名:二零一一年十一月摘要连通图广泛应用于交通建设,求连通图的最小生成树是最主要的应用。比如要在n个城市间建立通信联络网,要考虑的是如何保证n点连通的前提下最节省经费,就应用到了最小生成树。求图的最小生成树有两种算法,一种是Prim(普里姆)算法,另一种是Kruskal(克鲁斯卡尔)算法。本文主要介绍Prim(普里姆)算法及利用。本文从分析课题的题目背景、题目意义、题目要求等出发,分别从需求分析、总体设计、详细设计、测试等各个方面详细介绍了系统的设计与实现过程,最后对系统的完成情况进行了总结。关键字::连通加权图里权和最小的生成树称为最小生成树。从最小生成树定义看主要先了解图、树及生成树。本文中最小生成树在计算机中存储方法是应用邻接矩阵的形式存储。故也应了解邻接矩阵的定义。定义一(图):图是有一个非空的顶点集合和一个描述顶点之间的关系即边的集合组成。它可以形式化的定义为:G=(V,E)V={|VertexType}E={<,>|,∈V∧P(,) }其中,G表示一个图,V是图G中顶点的集合,E是V中顶点偶对的有限集,这些顶点偶对称为边,VertexType是用于描述顶点类型,集合E中P(,)的含义是:对有向图来说用“<>”表示,对无向图来说用“()”表示,即从到两个顶点之间存在边。定义二(树):树包含n(n>=0)个节点。当n=0时表示为空树。其定义如下:T=(D,R)其中,D为树中节点的有限集合,关系R满足一下条件:有且仅有一个节点k0属于D,它对于关系R来说没有前趋节点,结点k0称作树的根结点。除根结点k0之外,D中的每个结点仅有一个前趋结点,但可以有过个后继结点。D中可以有多个终端结点。即除根结点无父结点,其余各结点都有一个父结点和n(n>=0)个子结点。图的矩阵表示,本文中只用到了邻接矩阵,故在这只提出邻接矩阵的定义,及其图在邻接矩阵中的表示。设图A=(V,E)是一个有n个顶点的图,[n][n], 用来存放顶点的信息和边或弧的信息。定义三(邻接矩阵(AdjacencyMatrix)):是表示顶点之间相邻关系的矩阵。设G=(V,E)是一个图,其中V={v1,v2,…,vn}。G的邻接矩阵是一个具有下列性质的n阶方阵:(本文主要为无向图的邻接矩阵)(1)无向图的邻接矩阵是对称的;有向图的邻接矩阵可能是不对称的。(1)无向图的邻接矩阵中第i行第j列表示i结点到j结点的度即权值,可以表示为某一具体应用的数据。也表示i结点是否与j结点连通。定义四(生成树):如果T是G的一个生成子图又是一棵树,则称T是图G的一棵生成树。,普里姆算法按照以下步骤逐步扩大树中所含顶点的数目,直到遍及连通图的所有顶点。输入:一个加权连通图,其中顶点集合为V,边集合为E;初始化:Vnew={x},其中x为集合V中的任一节点(起始点),Enew={};重复下列操作,直到Vnew=V:在集合E中选取权值最小的边(u,v),其中u为集合Vnew中的元素,而v则不是(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);将v加入集合Vnew中,将(u,v)加入集合Enew中;输出:使用集合Vnew和Enew来描述所得到的最小生成树。#include<>#ode{ charvexs[10]; intedgs[10][10]; intn,e;}MGraph;structedg{ intv1; intv2; intcost;}A[10],B[10];//创建图voidGreateMGraph(MGraph*G){ inti,j,k,weight,m,n; intch1,ch2; chara,b; printf("\n\t\t输入顶点数边数(格式如:34):"); scanf("%d%d",&(G->n),&(G->e));//输入顶点数,边数 for(i=0;i<G->n;i++) { getchar(); printf("\n\t\t请输入第%d个顶点:",i+1); scanf("%c",&(G->vexs[i]));//输入顶点 } for(i=0;i<G->n;i++) for(j=0;j<G->n;j++) G->edgs[i][j]=0; for(k=0;k<G->e;k++) { // getchar(); printf("\n\t\t请输入第%d条边的顶点权值(格式如:ij):",k+1); getchar();scanf("%c%c%d",&a,&b,&weight); // s