《数据结构》图.ppt

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

第7章 图 7.1 图的定义和术语 7.2 图的存储结构 7.3 图的遍历 7.4 生成树 7.5 最短路径 7.6 拓扑排序 习题 7.1 图的定义和术语 7.2 图的存储结构 7.3 图的遍历 与树的遍历相同,把按一定的规律沿着图中的边访问图的每个顶点,并且使每一个顶点只被访问一次的过程称为图的遍历。 因为在图中任意两个顶点之间都可能有关系。为保证每一个顶点只被访问一次,必须对访问过的顶点进行标记,一般是用一个辅助数组visit[MAX]作为对顶点的标记。当顶点vi未被访问,visit[i]值为0;当顶点vi已被访问,则visit[i]值为1。 图的遍历方法通常有先深度遍历和先广度遍历两种。但经常称这两种遍历为深度优先搜索DFS和广度优先搜索BFS。 7.4 生成树 7.4.1 概念 生成树是一个连通图G的一个极小的连通子图。包含图G的所有顶点,但只有n-1条边,并且是连通的。在生成树中,不存在回路路径,但若在生成树中任意增加一条边,则必构成回路。一个连通图的生成树不是惟一的,例如,对一个连通图进行深度优先,在搜索过程中经过的边和图的顶点,构成深度优先生成树;若进行广度优先搜索,则构成广度优先生成树。非连通图有若干个连通分量组成,每一个连通分量都存在生成树,这样就构成生成森林。 7.5 最短路径 采用图结构来表示实际交通图,图中顶点代表城市,边表示城市之间的交通联系,边上的权为城市之间的距离,可能有这样一种问题存在。例如,A城到B城是否有通路;A城到B城的哪条通路代价最低(距离最短)。上述的问题就是最短路径问题。 这里讨论的图是带权有向图,并称路径的起始点为源点,路径的最后端点为终点。下面讨论两种最常见的最短路径问题,并给出最短路径问题的算法。 7.6 拓扑排序 图7.10 克鲁斯卡尔算法构造最小生成树的过程 ①初始化:图G中的n个顶点,构成n个连通分量。顶点xi对应的连通分量用集合i表示,所以sets[i]=i,即表示第i个顶点在集合i中。 ②依次取出的E中的边(按边权值递增顺序),设取出的边(xi,xj)。 ③判断:若sets[i]=sets[j],则表示xi和xj在同一个集合中,返回②;否则,xi和xj在不同集合中,则表示xi和xj落在不同连通分量上,转到④。 ④将边(xi,xj)并入T,同时将xj所在集合v(与xj连通的顶点)并入xi所在集合u(与xi连通的顶点),即:由v=sets[j]和u=sets[i],扫描辅助数组sets[],若sets[k]=v,则将sets[k]=u。返回②。 ⑤重复②、③、④,取出n-1条边。 例如,图7.10所示为依照克鲁斯卡尔算法构造一棵最小生成树的过程。sets[]是辅助数组状态。 在克鲁斯卡尔算法中,数据结构定义如下。 #define MAX 50 /* 最大边数 */ typedef struct /* 图的存储结构 */ { int begin,end; /* 边的相关顶点编号 */ int cost; } EDGE; /* 边的权值 */ EDGE edges[MAX]; /* 存放边的数组 */ int num; /* edges[]中实际存储的边数 */ 算法7.7 最小生成树的克鲁斯卡尔算法: int kruskal(EDGE edges[],int num) /* edges[]边是按权值递增有序,图中边数为num */ { int sets[N], t,i,j,k,u,v; for(i=0;i<N;i++) sets[i]=i; /* 初始化集合 */ k=0; t=0;  (算法下一页) while((t<N)&&(k<num)) { i=edges[k].begin; j=edges[k].end; k++; /* 按顺序取出一条边(xi,xj) */ u=sets[i]; v=sets[j]; /* xi在集合u中,xj在集合v中 */ if(u!=v) /* xi,xj不在同一集合中 */ { printf("%d, %d: %d\n",u,v,edges[k].cost); /* (xi,xj)并入T

文档评论(0)

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

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

版权声明书
用户编号:7065136142000003

1亿VIP精品文档

相关文档