1 / 45

图算法

图算法. 图的遍历. 和树的遍历类似,在此,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次。这一过程就叫做 图的遍历 (TraversingGraph) 。图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。 通常有两条遍历图的路径:深度优先搜索和广度优先搜索。它们对无向图和有向图都适用。. 图的遍历:广度优先搜索. 广度优先搜索 (Breadth-First Search) 遍历类似于树的按层次遍历的过程。

Download Presentation

图算法

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 图算法

  2. 图的遍历 • 和树的遍历类似,在此,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次。这一过程就叫做图的遍历(TraversingGraph)。图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。 • 通常有两条遍历图的路径:深度优先搜索和广度优先搜索。它们对无向图和有向图都适用。

  3. 图的遍历:广度优先搜索 广度优先搜索(Breadth-First Search)遍历类似于树的按层次遍历的过程。 假设从图中某顶点v出发,在访问v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。换句话说,广度优先搜索遍历图的过程是以v为起始点,由近至远,依次访问和v有路径相通且路径长度为1,2,…的顶点。

  4. v1 v3 v2 v4 v5 v6 v7 v1 v8 v3 v2 v7 v4 v5 v6 v8 (c) 图的遍历:广度优先搜索例子 例如,对右进行广度优先搜索 遍历的过程如图(c)所示, 得到的顶点访问序列为 v1->v2->v3->v4->v5->v6->v7->v8

  5. 图的遍历:深度优先搜索 深度优先搜索(Depth-First Search)遍历类似于树的先根遍历,是树的先根遍历的推广。 假设初始状态是图中所有顶点未曾被访问,则深度优先搜索可从图中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

  6. v1 v3 v2 v4 v5 v6 v7 v1 v8 v2 v3 v4 v6 v7 v8 v5 图的遍历:深度优先搜索例子 以图 (a)中无向图为例,深度优先搜索遍历图的过程如图 (b)所示。 (a) 由此,得到顶点访问序列为: v1->v2->v4->v8->v5->v3->v6->v7 (b)

  7. v1 v3 v2 (1) v1 (4) (6) v3 v2 (7) v5 v5 (2) (3) (5) v4 v4 无向图的DFS算法p106 对(a)图,由DFS算法可得(b)图有向树(实线)和余数(虚线),箭头表示搜索过程。 其中TREE={(1),(2),(3),(5)}, BACK={(4),(6),(7)} Num(v1)=1, Num(v2)=2, Num(v4)=3, Num(v3)=4,Num(v5)=5 后退边的方向是从num值高的顶点到num值小的顶点; 树枝边的方向是从num值低的顶点到num值高的顶点。 若从顶点A到可以沿着DFS外向树树枝走到顶点B,则成A点为B点的祖先,B点为A点的子孙。

  8. (1)TREE=Ø, BACK=Ø,i=1. All v ∈V 作【father(v)=0,mark(v)=0】 (2)任选一点r满足mark(r)=0,作【v=r,mark(v)=1,num(v)=i 】 (3)若所有与v点关联的边均已给出标志,则转(5);否则任选一未给标志的边(v,w)转(4)。 (4)给(v,w)边以v到w的方向,并给以标志*表示通过检查。若mark(w)=0,则作【i++,num(w)=i,TREE=TREE U{(v,w)},mark(w)=1,father(w)=v,v=w ,转(3) 】。 若mark(w)=1,则作 【BACK=BACK U {(v,w)} ,转(3) 】 (5)若father(v)!=0,则作 【v=father(v),转(3)】; 否则作 【若all v ∈V 恒有mark(v)=1, 则结束; 否则作[ i++,转(2)] 】 (1) v1 (4) (6) v3 v2 (7) v5 (2) (3) (5) v4 无向图的DFS算法p106

  9. v4 v6 v3 v2 v5 v7 v1 (8) v4 v6 (3) (4) (7) (2) (9) v3 v2 v5 (1) (6) (5) (11) (10) v7 v1 有向无环图的DFS算法p108 num(v1)=1, num(v2)=2, num(v3)=3, num(v4)=4, num(v5)=5, num(v6)=6, num(v7)=7, TREE={(1),(2),(3),(7),(9)} FORWARD={(4),(5)} CROSS={(8),(10)} BACK={(11)}

  10. 图的连通性:无向图的连通性 • 在简单无向图G = (V, E)中, 若存在一条路连接vi和vj, 则称顶点vi和vj是连接的。若G中任意两个顶点均是连接的,则称G是连通(connected)的,否则是不连通的或分离(separated)图。 • 在n阶简单图G, 如果对G的每对顶点u和v, deg(u) + deg(v)≥ n–1, 则G是连通图。 证明假设G不连通, 则G至少有两个分图。 设其中一个分图含有q个顶点, 而其余各分图共含有n– q个顶点。 在这两部分中各取一个顶点u和v, 则0≤deg(u)≤q – 1,0≤deg(v)≤n – q – 1,因此deg(u) + deg(v)≤n – 2,这与题设deg(u ) + deg(v)≥n – 1矛盾。

  11. 图的连通性:无向图的连通性 • 简单图是连通的当且仅当它具有生成树。 • P94 无向图的连通块数目判断算法 • (1) i=1, f=1 • (2) 若顶点vai和vbi同属于一个连通块时转(6);否则转(3)。 • (3)若顶点vai和vbi都不属于任何一个连通块,则用边ei=< vai, vbi >建立一新连通块,f=f+1,转(6) • (4)若顶点vai(或vbi ) 属于第p个连通块,但 vbi(或vai )不属于任何一个连通块,则边ei=< vai, vbi >也属于第p个连通块,转(6) • (5)若顶点vai和vbi分别属于不同的两个连通块,则用边ei=< vai, vbi >使这两个不同连通块连成一个连通块,f=f-1,转(6) • (6) i=i+1, 若i<m+1,转(2);否则结束。

  12. 图的连通性 • 在实际问题中, 除了考察一个图是否连通外, 往往还要研究一个图连通的程度, 作为某些系统的可靠性度量。 • 图的连通性在计算机网、通信网和电力网等方面有着重要的应用。 • 对于连通图G, 常由于删除了图中的一些边或一些顶点而影响图的连通性。 • 删除边只需将该边删除, 而删除顶点v是指将v及所关联的边都删除。

  13. 图的连通性 • 设G = (V, E)是连通图, 若存在SV, 使w(G – S)>1, 而删除了S的任一真子集后得到的子图是连通图, 则称S是G的一个点割集(cut-set of node)。 • 切割点:若v ∈ G,将v点及与v点关联的所有的边从G中消去,余下的图的连通块数目增加了,则称v点为切割点。 (cut-point) • 互连通图:无切割点的连通图叫做互连通图。 • 互连通块:图G的最大的互连通图叫做互连通块。

  14. v7 v4 e4 e6 e7 e1 v3 e8 e3 v6 v1 v5 e9 e2 e5 v2 例 在上图中{v2, v7}, {v3}, {v4}为点割集, {v3}, {v4}均为割点 例 在下图中的{v3}和{v2}都是割点, {v2, v3,v4},{v1, v2,v4,v5}都不是点割集。

  15. v v …… …… w1 w2 ws w1 ws w2 G2 G1 Gs G2 G1 Gs 连通块划分:利用DFS求切割点p110 G=(V,E)是连通的无向图,T是DFS树,r是它的根结点,v是非根结点。 根节点r为切割点,当且仅当r有多于一个儿子结点。 非根结点v为切割点,当且仅当v的任一儿子结点w满足:w不存在它的后裔结点(包括w)到v的祖先结点间的后退边。

  16. v …… w1 w2 ws G1 G2 Gs 连通块划分:利用DFS求切割点p110 引进low(v)=min{num(w)|w ∈ T(v)},其中T(v)是由v出发沿DFS树T到达v的后裔结点u,最多通过一后退边(u,w)到达的点w的集合。 利用DFS搜索法对图G的全部顶点和边进行检查过程,沿途留下low(v)的信息。搜索结束时,非根结点v是G的切割点的充要条件是v有儿子w,使得low(w)>=num(v)

  17. (1)i=1, STACK=Ø. All v ∈V 作【father(v)=0,mark(v)=0】 (2)任选一点r满足mark(r)=0,作【v=r, mark(v)=1, num(v)=i, low(v)=i 】 (3)若所有与v点关联的边均已给出标志,则转(5);否则任选一未给标志的边(v,w),给(v,w)边以v到w的方向,并给以标志*表示通过检查。并将(v,w)边加到栈STACK顶上,转(4)。 (4) 若mark(w)=0,则作【i++, low(w)=i , num(w)=i, mark(w)=1, father(w)=v, v=w ,转(3) 】。 若mark(w)=1,则作 【low(v)=min{low(v), num(w)} ,转(3) 】 (5)若father(v)!=0,则作 【若low(v)>=num(father(v)),则作【从堆栈STACK中移走边(father(v),v)及其上栈中元素并输出,转(6)】,否则转(6)】; 否则结束。 (6)low(father(v))=min{low(v), low(father(v))}, v=father(v), 转(3)。 连通块划分:利用DFS求切割点p110

  18. 图的连通性:简单有向图的连通性 一个有向图G是强连通的充要条件是G中有一个回路, 它至少包含每个顶点一次。 证明充分性 如果G中有一个回路, 它至少包含每个顶点一次, 则G中任何两个顶点都是相互可达的, 即G是强连通图。 必要性 若有向图G是强连通的, 则任何两个顶点都是相互可达的, 所以必可作一个回路经过图中所有各点。 否则必有一个回路不包含某一顶点v, 因而v与回路上的各顶点就不是相互可达的, 与强连通条件矛盾。

  19. 图的连通性:简单有向图的连通性 在简单有向图G中, • (1) 若对G的边不考虑方向, 即把它看作无向图是连通的, 则称G是弱连通(weakly connected)的; • (2) 若对G中任意两个顶点u和v, 或者u到v有路, 或者v到u有路, 则称G是单向连通的(unilaterally connected); • (3) 若对G中任意两个顶点u和v, u到v有路且v到u有路, 则称G是强连通的(strongly connected)。 • 由定义可知: 若图G是强连通的, 则必是单向连通的; 若图G是单向连通的, 则必是弱连通的。但这两个命题, 其逆不成立。

  20. 强连通块的划分 • 极大的强连通子图称为强连通块。 • 强连通块划分算法P112-114

  21. 最短通路问题 • 求带权简单连通图一点到另一点的最短通路 • Dijkstra算法(《离散数学及其应用》p477 • 求一点到其他各点最短通路 • 稍微修改Dijkstra算法 • 求任意两点间最短距离 • Floyed算法

  22. 图的生成树 • 图的生成树的应用 • 道路扫雪 • IP组播

  23. 连通简单图的生成树生成算法:广度优先算法 • 任意选取图中一个顶点为根。然后添加与这个顶点相关联的所有边。在这个阶段所添加的新顶点成为生成树在1层上的顶点。任意地排序它们。 • 下一步,按顺序访问一层上地每个顶点,只要不产生简单回路,就添加与这个顶点相关联地每条边到树里。这样就产生了树里在2层上地顶点。 • 遵循相同的过程,直到已经添加了树里的所有顶点。 • 图边数有穷且连通,故这个过程以产生生成树而告终。

  24. v1 v3 v2 v4 v5 v6 v7 v1 v8 v3 v2 v7 v4 v5 v6 v8 (c) 连通简单图的生成树生成算法:广度优先算法 例如,对右图进行广度优先搜索 遍历的过程如图(c)所示, 得到的顶点访问序列为 v1->v2->v3->v4->v5->v6->v7->v8

  25. 连通简单图的生成树生成算法:深度优先算法 • 任意选取图中一个顶点为根。通过相继地添加边来形成在这个顶点上开始的通路,其中每条新边都与通路上的最后一个顶点以及还不在通路上的一个顶点相关联。继续尽可能地添加边到这条通路。 • 若这条通路经过图的所有顶点,则由这条通路组成地树就是生成树。否则,则必须添加其他的边。后退到通路里的次最后顶点,若有可能,则形成在这个顶点上开始的经过还没有访问过的顶点的通路。若不能这样做,则再在通路里后退一个顶点,然后再试。重复这个过程,在所访问过的最后一个顶点上开始,在通路上一次后退一个顶点,只要有可能就形成新的通路,直到不能添加更多的边为止。 • 图边数有穷且连通,故这个过程以产生生成树而告终。

  26. v1 v3 v2 v4 v5 v6 v7 v1 v8 v2 v3 v4 v6 v7 v8 v5 连通简单图的生成树生成算法:深度优先算法 以下图(a)中无向图为例,深度优先搜索遍历图的过程如图(b)所示。 (a) 由此,得到顶点访问序列为: v1->v2->v4->v8->v5->v3->v6->v7 (b)

  27. 连通简单图的生成树生成算法:深度优先算法 • 如何生成所有的生成树?(决策树) • 本质:回溯

  28. 连通简单图的生成树生成算法:深度优先算法 • 回溯应用举例 • 1、图着色 能否用3种颜色为右图着色, 使得相邻顶点不同颜色? • 2、n皇后问题 在n*n棋盘上,如何放置n个皇后,使得没有两个皇后可以互相攻击?(p102)

  29. 连通简单图的生成树生成算法:深度优先算法 • 回溯应用举例 • 3、迷宫:求出在下面的迷宫里从标记X的出发位置到出口的通路

  30. 1、图着色 首先选择某个顶点a并且指定它的颜色为1,然后挑选第二个顶点b,而且若b不与a相邻,则指定它的颜色为1。否则,指定b颜色为2。然后来到第三个顶点c。若有可能,则对c用颜色1。否则,若有可能则用颜色2。只有当颜色1和颜色2都不能用时才应当用颜色3。 继续这个过程,只要有可能就指定n种颜色表中第一种允许的颜色给新顶点。若遇到不能用n种颜色中的任何一种来着色,则回溯到最后一次所做的指定,并且若有可能就改变最后着色的顶点的颜色,用颜色表中下一种允许的颜色。若不可能改变颜色,则再回溯到更前面的指定,一次后退一步,知道有可能改变一个顶点的颜色为止。然后只要有可能就继续指定新顶点的颜色。

  31. 图着色 能否用3种颜色为右图着色, 使得相邻顶点不同颜色?

  32. 2、n皇后问题 • 从空棋盘开始,在k+1阶段上,尝试在棋盘上第k+1行里放置一个新的皇后,其中前k行里已经有了皇后。检查第k+1行里的格子,从第一列的格子开始,寻找放置这个皇后的位置,使得它不与已经在棋盘上的皇后在同一行里或在同一斜线上。 • 若不可能在第k+1行里找到放置皇后的位置,则回溯到第k行里对皇后的放置。在这一行里下一个允许的列里放置皇后,若这样的行存在的话。若没有这样的列存在,则继续回溯。

  33. 2、n皇后问题 • 可以把这个问题可能结果看成一个1,2,3,4的排列,如(1,4,3,2)表示第一行的第1列,第二行的第4列,第三行的第3列,第四行的第2列放置皇后。 • 可以将所有可能的排列用n元n层的搜索树表示。 • 对该树做深度优先搜索,并在每一步检查是否符合要求,不满足则回溯。任何一条从根结点到叶子结点的路径都是问题的解

  34. 3、迷宫 • 每一步的可能行动序列为{1向左,2向上,3向右,4向下}。每一步如果可能尽量按照行动序列次序执行。 • 遇到走不通的时候看看是否有下个行动可执行。如果没有则回溯上一步,换用行动序列中的下个行动。

  35. 连通简单图的生成树生成算法:其他算法 • 教材p95:利用det(BkBkT)生成树的清单 • 教材p96:利用基本割集多项式生成 • 教材p98:Minty算法 • 教材p101:Mayeda-Seshu算法

  36. 最小生成树 问题背景: 假设要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。这时,自然会考虑这样一个问题,如何在最节省经费的前提下建立这个通信网。 在每两个城市之间都可以设置一条线路,相应地都要付出一定的经济代价。n个城市之间,最多可能设置n(n-1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢?

  37. 最小生成树 分析问题(建立模型): 可以用连通图来表示n个城市以及n个城市间可能设置的通信线路,其中图的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价。对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。现在,我们要选择这样一棵生成树,也就是使总的耗费最少。这个问题就是构造连通网的最小代价生成树(MinimumCostSpanningTree)(简称为最小生成树)的问题。一棵生成树的代价就是树上各边的代价之和。

  38. 最小生成树 构造最小生成树可以有多种算法。其中多数算法利用了最小生成树的下列一种简称为MST的性质: 假设G=(V,E)是一个连通图,U是顶点集V的一个非空子集。若 (u,v)是一条具有最小权值(代价)的边,其中u ∈ U,v∈V-U,则必存在一棵包含边 (u,v)的最小生成树。

  39. 最小生成树 可以用反证法证明之: 假设图G的任何一棵最小生成树都不包含(u ,v)。设T是连通网上的一棵最小生成树,当将边(u,v)加入到T中时,由生成树的定义,T中必存在一条包含(u,v)的回路。另一方面,由于T是生成树,则在T上必存在另一条边(u’,v’),其中u’∈U,v’∈V-U,且u和u’之间,v和v’之间均有路径相通。删去边(u’, v’),便可消除上述回路,同时得到另一棵生成树T,。因为(u,v)的代价不高于(u’,v’),则T’的代价亦不高于T,T’是包含(u,v)的一棵最小生成树。由此和假设矛盾。 u’ v’ u v U V-U

  40. 最小生成树算法 解决方案: 普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法是两个利用MST性质构造最小生成树的算法。 下面先介绍Prim算法。 假设G=(V,E)是连通图,TE是N上最小生成树中边的集合。算法从U={u0}(u0∈V),TE={}开始,重复执行下述操作:在所有u∈U,v ∈V-U的边(u,v) ∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。此时TE中必有n-1条边,则T=(V,TE)为图G的最小生成树。

  41. v1 v1 6 5 1 v4 v2 5 5 v4 v2 v3 v3 3 6 4 2 6 v5 v6 v5 v6 v1 v1 v1 v1 v2 v4 v2 v4 v2 v4 v2 v4 v3 v3 v3 v3 v5 v6 v5 v6 v5 v6 v5 v6 最小生成树算法:Prim算法例子 (a) (b) (c) (d) (e) (f) Prim算法构造最小生成树的过程

  42. 最小生成树算法:Prim算法 • Prim算法思想:任意时刻的中间结果都是一棵树。从一个点开始,每次都花最少的代价,用一条边把一个不在树里的点加进来。为了方便选择离树最近的点,需要借助堆。 • 算法复杂度:每次选边的复杂度为O(logm),所以时间复杂度为O(m+nlogm)

  43. 最小生成树算法:Kruskal算法 克鲁斯卡尔算法从另一途径求图的最小生成树。假设连通图G=(V,E),则令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边而选择下一条代价最小的边。依次类推,直至于中所有顶点都在同一连通分量上为止。

  44. v1 v1 6 5 1 v2 5 5 v4 v2 v4 v3 v3 3 6 4 2 6 v5 v6 v5 v6 v1 v1 v1 v1 v2 v2 v4 v2 v4 v4 v2 v4 v3 v3 v3 v3 v5 v6 v5 v6 v1 v1 v5 v6 最小生成树算法:Kruskal算法例子 • (a) (b) (c) (d) (e) (f) 克鲁斯卡尔算法构造最小生成树的过程

  45. 最小生成树算法:Kruskal算法 • Kruskal算法思想:任意时刻的中间结果都是一个森林。把边按权大小排序。每次选权最小且不产生回路的边加进来。直到找到n-1条边加到树为止。 • 算法复杂度:克鲁斯卡尔算法的时间复杂度为O(mlogm)(m为网中边的数目),因此它相对于Prim算法而言,适合于求边稀疏的网的最小生成树。

More Related