45蛤蟆的数据结构笔记之四十五克鲁斯卡尔算法.docx

45蛤蟆的数据结构笔记之四十五克鲁斯卡尔算法.docx

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
45蛤蟆的数据结构笔记之四十五克鲁斯卡尔算法

45. 蛤蟆的数据结构笔记之四十五克鲁斯卡尔算法 本篇名言:“假如生活欺骗了你 , 不要忧郁 , 也不要愤慨 ! 不顺心的时候暂且容忍 : 相信吧 , 快乐的日子就会到来。-- 普希金” 上两篇学习了弗洛伊德和迪杰特斯拉算法。这次来看下克鲁斯卡尔算法。 克鲁斯卡尔算法 克鲁斯卡尔( HYPERLINK /subview/580403/580403.htm \t _blank Kruskal)算法是在剩下的所有未选取的边中,找最小边,如果和已选取的边构成回路,则放弃,选取次小边。是实现图的 HYPERLINK /view/288214.htm \t _blank 最小生成树最常用的算法。 生成树定义 对于有 n 个顶点的无向连通图 G, 把遍历过程中顺序访问的两个顶点之间的路径记录下来,这样G中的n个顶点以及由出发点一次访问其余 n-1 个顶点所经过的 n-1 条边就构成了G 的极小连通子图,也就是 G 的一棵生成树,出发顶点是生成树的根。 最小生成树 给定一个连通网络, 要求构造具有最小代价的生成树时, 也即使生成树的各边的权值总和达到最小。 把生成树各边的权值总和定义为生成树的权, 那么具有最小权值的生成树就构成了连通网络的最小生成树。 构造最小生成树的算法有很多种,其中大多数的算法都利用了最小生成树的一个性质 , 简称为 MST 性质:假设 G=(V,E)是一个连通网络,U 是 V 中的一个真子集,若存在顶点 u ∈U 和顶点v∈(V ? U ) 的边(u,v)是一条具有最小权值的边,则必存在 G 的一棵最小生成树包括这条边(u,v)。 构造最小生成树的常用算法主要有:Prim(普里姆)算法和 Kruskal(克鲁斯卡尔)算法。 本篇将的是克鲁斯卡尔算法,下篇我们将普里姆算法。 克鲁斯卡尔算法 设 G=( V,E )是一个有 n 个顶点的连通图,则令最小生成树的初始状态为只有 n 个顶点而无任何边的非连通图 T={V,{?}},图中每个顶点自成一个连通分量。依次选择 E 中的最小代价边,若该边依附于 T 中的两个不同的连通分量,则将此边加入到 T 中;否则,舍去此边而选择下一条代价最小的边。以此类推,直到 T 中所有顶点都在同一连通分量上为止。这时的 T 就是 G 的一棵最小生成树。 典型案例 最典型的是一个题目如下: 如下图1所示的赋权图表示某七个城市及预算它们之间的一些某些直接通信道路造价(单位:万元) ,试给出一个设计方案,使得各城市之间既能够通信又使总造价最小并计算其最小值。 该图2的邻接矩阵为 赋权图3中 i,j 两个城市之间的造价费用边记为S ij, ,则从小到大排序 步骤1 初始化如下图4: 步骤2 从图5中选择造价最小的边,S17 ,此时 T={{2,3,4,5,6},{ S 17 }},造价 Cost=1 步骤3 图6接着选择造价第二小的序号 2 的边,即S 34 ,加入 T 中,此时 T={{2,5,6},{ S 17 , S34 }},造价 Cost=1+3=4 步骤4 以此类推,直到选择造价第五小的序号为 5 的边,即S 23,由于加入后边S23, S27,S37 将构成回路,因此舍弃该边.图7 步骤5 以此类推,直到所有顶点已包含在树中,整棵最小生成树已经构造完成。如图8 代码实现 结构体定义 typedef struct { int begin; int end; int weight; }edge; typedef struct { int adj; int weight; }AdjMatrix[MAX][MAX]; typedef struct { AdjMatrix arc; int vexnum, arcnum; }MGraph; 定义边,包括开始、结束和权值。 定义一个矩阵,每个矩阵点包含是否邻接数值以及权值。 定义一个图,包括矩阵和顶点数量。 main 根据输入来创建图, 然后生成最小生成树。 如下图9 CreatGraph 构造图。 输入城市和边数。 城市数量就是顶点数量。 根据顶点的数量,将每个顶点间的距离初始化为0。 然后输入城市之间的费用。先输入两个城市的坐标然后输入城市的费用(权值)。 如下图10: sort 对权值进行排序 输入参数为一个边的数组,图指针。 根据图中边的总数进行处理, 从第一个边开始,和其余的边进行比较,如果大于其它边则调用Swapn函数进行互换。 实现所有边权值从小到大的排列。 Swapn 将两个边的信息进行互换,包括起点、终点和权值。 MiniSpanTree 该函数用于生成最小生成树。 定义一个临时边的数组和整型数组。 根据顶点数量(城市数量),来处理所有边的起始点和结束点,以及权值,并保持在临时边数组中。 调用sort函数进行排

文档评论(0)

liudao + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档