- 1、本文档共123页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
7.1 图的定义和术语 一、图的定义: 图(Graph)是由非空的顶点集合和一个描述顶点之间关系(边或者弧)的集合组成,其二元组定义为: G=(V,E) V={vi| vi∈dataobject} E={( vi,vj)| vi, vj ∈V∧P(vi, vj)} 其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合,集合E中P(vi,vj)表示顶点vi和顶点vj之间有一条直接连线。集合E可以是空集,若E为空,则该图只有顶点而没有边。偶对(vi,vj)表示一条边。? 一、数组表示法(邻接矩阵) 1. 定义 在邻接矩阵表示中,除了存放顶点本身信息外,还用一个矩阵表示各个顶点之间的关系。若(i,j)∈E(G)或〈i,j〉∈E(G),则矩阵中第i 行 第j 列元素值为1,否则为0 。 一、深度优先遍历(depth-first-search) 方法: 深度优先搜索遍历类似于树的先序遍历。假定给定图G的初态是所有顶点均未被访问过,在G中任选一个顶点i作为遍历的初始点,则深度优先搜索遍历可定义如下: (1)首先访问顶点i,并将其访问标记置为访问过,即visited[i]=1; (2)然后搜索与顶点i有边相连的下一个顶点j,若j未被访问过,则访问它,并将j的访问标记置为访问过,visited[j]=1,然后从j开始重复此过程,若j已访问,再看与i有边相连的其它顶点; (3)若与i有边相连的顶点都被访问过,则退回到前一个访问顶点并重复刚才过程,直到图中所有顶点都被访问完止。 (4)深度优先搜索是一种递归的过程 深度优先遍历算法 Void Traver(Mgragh *g) {int i; for(i=0;ig.n;i++) visited[i]=False; For(i=0;ig.n;i++) if(!visited[i]) BFS(g,i); } 6.4 图的连通性问题 一、生成树 定义:在一个无向连通图G中,如果取它的全部顶点和一部分边构成一个子图G’,若边集E(G’)中的边刚好将图的所有顶点连通但又不形成环路,我们就称子图G’是原图G的生成树。 由于n个顶点的连通图至少有n-1条边,而所有包含n-1 条边及n个顶点的连通图都是无回路的树,所以生成树是连通图中的极小连通子图,所谓极小是指边数最少,若在生成树中去掉任何一条边,都会使之变为非连通图,若在生成树上任意增加一条边,就会构成回路。那么,对给定的连通图,如何求得它的生成树呢?回到我们前面提到的图的遍历,访问过图中一个顶点后,要访问下一个顶点, 一般要求两个顶点有边相连,即必须经过图中的一条边,要遍历图中n 个顶点且每个顶点都只遍历一次,则必须经过图中的n-1条边,这n-1条边构成连通图的一个极小连通子图,所以它是连通图的生成树,由于遍历结果可能不唯一,所以得到的生成树也是不唯 一的。 4、构造最小生成树方法 方法一:普里姆(Prim)算法 假设G=(V,E)是一个具有n 个顶点的连通网络,T=(U,TE)是G的最小生成树,其中U是T的顶点集,TE是T的边集,U和TE的初值均为空。 算法开始时,首先从V中任取一个顶点(假定为V1),将此顶点并入U中,此时最小生成树顶点集U={V1}; 然后从那些其一个端点已在U中,另一个端点仍在U外的所有边中,找一条最短(即权值最小)的边,假定该边为(Vi,Vj),其中Vi∈U,Vj∈W(W=V-U),并把该边(Vi,Vj)和顶点Vj分别并入T的边集TE和顶点集U; 如此进行下去,每次往生成树里并入一个顶点和一条边,直到n-1次后,把所有n 个顶点都并入生成树T的顶点集U中,此时U=V,TE中包含有(n-1)条边; 这样,T就是最后得到的最小生成树。 普里姆算法中每次选取的边两端,总是一个已连通顶点(在U集合内)和一个未连通顶点(在U集合外),故这个边选取后一定能将未连通顶点连通而又保证不会形成环路。 方法二:克鲁斯卡尔(Kruskal)算法 假设G =(V,E)是一个具有n个顶点的连通网络,T=(U,TE)是G 的最小生成树,U的初值等于V,即包含有G中的全部顶点,TE的初值为空集。 基本思想:将图G中的边按权值从小到大的顺序依次选取,若选取的边使生成树T不形成环路,则把它并入TE中,保留作为生成树T的一条边,若选取的边使生成树T形成环路,则将其舍弃,如此进行下去,直到TE中包含n-1条边为止。此时的T即为最小生成树。 4、算法实现 以邻接表作存储结构 把邻接表中所有入度为0的顶点进栈 栈非空时,输出栈顶元素Vj并退栈;在邻接表中查找Vj的直接后继Vk,把Vk的
文档评论(0)