数据结构第七章(图).ppt

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

第7章 图 二、图的邻接表存储表示 7.4-1 最小生成树 7.4-2 最短路径 问题解法 单源最短路径问题 — Dijkstra算法 所有顶点之间的最短路径 — Floyd算法 给定一个带权有向图G 与源点v,求从v到G 中其它顶点的最短路径。限定各边上的权值大于或等于0。 Floyd算法的基本思想: 定义一个n阶方阵序列: D(-1), D(0), …, D(n-1). 其中 D(-1) [i][j] = G.arcs[i][j]; D(k) [i][j] = min { D(k-1)[i][j], D(k-1)[i][k] + D(k-1)[k][j] }, k = 0,1,…, n-1 D(0) [i][j]是从顶点vi 到vj , 中间顶点是v0的最短路径的长度, D(k) [i][j]是从顶点vi 到vj , 中间顶点的序号不大于k的最短路径长度, D(n-1)[i][j]是从顶点vi 到vj 的最短路径长度。 例 1 6 5 4 3 2 6 5 1 3 5 6 6 4 2 5 1 3 1 1 6 3 1 4 1 6 4 3 1 4 2 1 1 6 4 3 2 1 4 2 5 1 6 5 4 3 2 1 4 2 5 3 1、普里姆算法 普里姆算法的时间复杂度为O(n2),与网中的边数无关,因此适用于求边稠密的网的最小生成树。 2、克鲁斯卡尔(Kruskal)算法 而克鲁斯尔算法恰恰相反,它的时间复杂度为O(eloge)(e为网中边的数目),因此,它相当于普里姆算法而言,适合于求边稀疏的网的最小生成树。 例 1 6 5 4 3 2 6 5 1 3 5 6 6 4 2 5 1 6 5 4 3 2 1 2 3 4 5 克鲁斯卡尔(Kruskal)算法: 假设连通网N=(V,{E}),则令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点自成一个连同分量。在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边而选择下一条代价最小的边。依次类推,直至T中所有顶点都在同一连通量上为止。 2、克鲁斯卡尔(Kruskal)算法 (1)用顶点数组和边数组存放顶点和边信息 顶点结点: typedef struct { int data; //顶点信息 int jihe; }VEX; 边结点: typedef struct { int vexh, vext; //边依附的两顶点 int weight; //边的权值 int flag; //标志域 }EDGE; (2)初始时,令每个顶点的jihe互不相同;每个边的flag为0 (3)选出权值最小且flag为0的边 (4)若该边依附的两个顶点的jihe 值不同,即非连通,则令该边的flag=1, 选中该边; (5)重复上述步骤,直到选出n-1条边为止 再令该边依附的两顶点的jihe以及两集合中所有顶点的jihe相同。 若该边依附的两个顶点的jihe 值相同,即连通,则令该边的flag=2, 即舍去该边 例 1 6 5 4 3 2 6 5 1 3 5 6 6 4 2 5 data jihe 1 2 4 5 3 6 1 2 4 5 3 6 1 2 4 5 3 6 vexh weight 1 1 2 2 1 3 2 3 3 5 4 4 vext flag 6 1 5 3 5 5 0 0 0 0 0 0 0 1 3 4 2 5 6 7 8 9 3 3 4 5 5 6 6 6 6 4 2 6 0 0 0 0 1 1 1 1 1 4 2 1 1 1 2 2 2 2 2 1 6 5 4 3 2 1 2 3 4 5 2、克鲁斯卡尔(Kruskal)算法 交通网络中常常提出这样的问题:从甲地到乙地之间是否有公路连通? 在有多条通路的情况下,哪一条路最短? 最短路径: 如果从图中某一顶点(称为源点)到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小。 通常把一条路径上所经过边或弧上的权值之和定义为该路径的路径长度。 从一个顶点到另一个顶点可能存在着多条路径,把路径长度最短的那条路径称为最短路径,其路径长度称为最短路径长度。 单源点到其余顶点的最短路径 迪杰斯特拉(Dijkstra) 算法的基本思想是: 逐步扩充一个集合

文档评论(0)

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

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

1亿VIP精品文档

相关文档