- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
E-南京大学.ppt
* * * * * * * * * 生成树 离散数学─树 南京大学计算机科学与技术系 内容提要 生成树 深度优先搜索 广度优先搜索 有向图的深度优先搜索 回溯 最小生成树算法 生成树 定义:若图G的生成子图是树,则该子图称为G的生成树。 无向图G连通 当且仅当 G有生成树 证明(充分性显然): ? 注意:若G是有简单回路的连通图,删除回路上的一条边,G中的回路一定减少。(因此,用“破圈法”总可以构造连通图的生成树) 简单无向图G是树 当且仅当 G有唯一的生成树。 注意:G中任一简单回路至少有三条不同的边。 构造生成树:深度优先搜索 a c b e d e a c b e d e 深度优先搜索算法 Procedure DFS(G: 带顶点v1, …,vn的连通图) T:=只包含顶点v1的树; visit(v1); Procedure visit(v: G的顶点) for v每个邻居w { if w不在T中 then { 加入顶点w和边{v, w}到T; visit(w); } } depth-first search tree Normal spanning trees are also called depth-first search trees. 构造生成树:广度优先搜索 a b e d c e a c b e d e 广度优先搜索算法 Procedure BFS(G: 带顶点v1, …,vn的连通图) T:=只包含顶点v1的树; L:=空表; 把v1放入表L中 While L非空 { 删除L中的第一个顶点v; for v的每个邻居w { if w既不在L中也不在T中 then { 加入w到L的末尾; 加入顶点w和边{v, w}到T; } } } 有向图的深度优先搜索 a b c d e f g h i j k l 有向图的深度优先搜索 /pinewiki/DepthFirstSearch 回溯(八皇后) 在n×n格的棋盘上放置彼此不受攻击的n个皇后。 从空棋盘开始 尝试第1列,第1行,…n行; 尝试第2列,第1行,…n行; …. 尝试第k+1列,第1行,…n行; … 回溯(子集和) 给定一组正整数x1, …, xn ,和为M的一个子集? 从空子集开始 尝试添加一项, 和等于M,结束; 和不超过M,子集包含它; 没有合适添加项,去掉和的最后一项, 回溯(子集和) 举例:{31, 27, 15, 11, 7, 5}, 和为39的子集? ?? {31} {27} {27, 7} {27, 11} {31, 5} {31, 7} {27, 7, 5} Prim算法(求最小生成树) 1: E={e}, e是权最小的边 2: 从E以外选择与E里顶点关联,又不会与E中的边构成回路的权最小的边加入E 3: 重复第2步,直到E中包含n-1条边 算法结束 Prim算法(举例) 铺设一个连接各个城市的光纤通信网络(单位:万元)。 f e b a c d 54 60 36 38 8 40 48 20 45 28 15 38 30 62 25 12 10 h g Kruskal算法(求最小生成树) 1: E={ } 2: 从E以外选择不会与E中的边构成回路的权最小的边加入E 3: 重复第2步,直到E中包含n-1条边 算法结束 Kruskal算法(举例) 铺设一个连接各个城市的光纤通信网络(单位:万元)。 f e b a c d 54 60 36 38 8 40 48 20 45 28 15 38 30 62 25 12 10 h g Kruskal算法(举例) 27 26(9) 42 21(4) 21(5) 53 25(7) 33 28 36 18(3) 17(2) 34 29 22 A H J E C B G F D 16(1) 21(6) 25(8) I 后面证明:Kruskal算法的正确性 引理(更换生成树的边) T与T‘均是图G的生成树,若e?ET且e?ET’,则必有e?ET’, e?ET, 且T-{e}?{e}和T-{e}?{e}均是G的生成树。 设e=uv, T-{e}必含两个连通分支,设为T1, T2。因T是连通图,T中有uv-通路,其中必有一边满足其两个端点x,y分别在T1, T2中,设其为e,显然T-{e}?{e}是生成树。 而T’-{e’}中x,y分属两个不同的连通分支,但在T*=T’-{e’}?{e}中,xu-通路+e+vy通路是一条xy-通路,因此T’-{e’}?{e}连通,从而 T-{e}?{e}是生成树。 T1 T2
文档评论(0)