图的最小生成树C.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
西北师范大学地环学院地理信息系 数据结构实验讲义 十二 最小生成树 张长城 2011-2-8 [图的最小生成树,Prim算法,C语言实现] 实验任务描述 1 有向含权图的存储设计; 2 分析图的最小生成树的算法; 3 C语言实现图的最小生成树。 有向图的存储和最小生成树算法分析 1 Prim最小生成树 对一个图而言,最小生成树的算法经常用到的是Prim算法。以下图为例: 图 1 有向图的范例图 Prim的算法,主要是构造两个集合:U、V,其中,U中有第0个顶点,V中有其余的顶点,一般编程中,设NO(NO=10000)为已经使用,则开始状态就是: V集合中,第0个元素是NO,代表已经放入U集合,其余的是顶点编号; U集合中,第0个元素是0,代表第0个顶点在V集合。 U V 0 NO,1,2,3,4,5 表1 计算开始的状态 在这个时候,考虑的第一步就是:从U中取到顶点编号、与V中的顶点中寻找最短距离的顶点,根据图1,则自然是到U中的0到V中的2、就是V1到V3,于是,把该顶点放入U集合,V集合中标记已经使用,就是: U V 0,2 NO,1,NO,3,4,5 表2 找到第一个最小邻接顶点 图中表示就是: 图 2找到第一个最短邻接顶点 U中有两个顶点,就是从U中逐个取0、2顶点,和V中各个顶点中对比,找到下一个最短距离的顶点,根据图1、不难发现是U中的2到V中的5,就是V3到V6。于是再次把5放入U集合,V中标记6已经使用,表处理如下: U V 0,2,5 NO,1,NO,3,4,NO 表3 找到第二个最小邻接顶点 这个过程的结果就是相当于V3连接到V6,有下图: 图 3找到第二个最短邻接顶点 注意表3,再次从U中逐个取出顶点、和V中未使用的顶点逐个对比,寻找最小路径的顶点,可以找到是U中的5到V中的3,就是V6到V4,于是表格再次处理如下: U V 0,2,5,3 NO,1,NO,NO,4,NO 表4 找到第三个最小邻接顶点 所生成的图就是: 图 4找到第三个最短邻接顶点 由于表4中还有没使用的顶点,于是再次逐个从U中取顶点、逐个和V中的顶点对比,寻找最短路的顶点,不难发现有U中2到V中1、就是V3到V2距离最短,于是再次处理表4、成为: U V 0,2,5,3,1 NO,NO,NO,NO,4,NO 表5 找到第四个最小邻接顶点 生成的图就是: 图 5找到第四个最短邻接顶点 最后,再次从U中逐个取顶点,寻找和V中顶点最小距离的顶点,就是1到4相当与V2到V5,处理表格5为: U V 0,2,5,3,1,4 NO,NO,NO,NO,NO,NO 表6 找到第五个最小邻接顶点 处理到图就是: 图 6最终的最小生成树 由于V集合中所有顶点都被使用了,所以程序到此停止。 2 C语言的含权图的存储 对含权图,其不连接数学上是无穷大,这在C语言中是无法实现的,所以一般用一个大数来表示,比如用1000,在上述图中,这个数字是足够了。所以这个邻接矩阵就是: A= 图1的邻接矩阵 这个写法表明:C语言中的含权邻接矩阵和普通邻接矩阵没有什么差别,差别仅仅在程序处理中:一旦遇到一个指定的大数,则认为是不通的,由此可知对图的存储结构不需要做任何变动。 3 C语言Prim最小生成树程序设计 首先我们要有两个集合,用来表示U、V,对于大的图,最好使用链表,而对于我们这个简单的图,仅仅使用数组来表示就足够了。我们把图1中邻接矩阵的1000在C中定义为NO,这样方便后续的处理。 开始,我们将在U数组中保存0,而在V数据中保存:NO、1、2、3、4……,这代表着先把第0个顶点存进U集合,而第1、第2、第3…..等后续的顶点在V集合,并且设置n变量记录进入U集合中的顶点个数,这样就完成了初始化操作。 对于图,我们依然使用前面的存储结构,所以图的顶点个数可以来自于G-num,而U、V的大小可以通过动态申请内存来完成。 所以整个初始化工作可以用以下程序完成: 1 2 3 4 5 6 7 8 int *U,*V,i,j,n,min,a,b,ma,mb; U=(int *)malloc(sizeof(int)*G-num); V=(int *)malloc(sizeof(int)*G-num); for(i=0;iG-num;i++) { U[i]=0;V[i]=i; } V[0]=NO;n=1; 表7 PRIM最小生成树初始化 见P0.c 下一步,就是要有函数来判断V集合中是否全部取空了,这个集合全部为空,就是说所有的值都是NO,为此我们要编写一个函数来做判断,就是: 1 2 3 4 5

文档评论(0)

2232文档 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档