有向图的DFS与分块汇总课件.ppt
《有向图的DFS与分块汇总课件.ppt》由会员分享,可在线阅读,更多相关《有向图的DFS与分块汇总课件.ppt(43页珍藏版)》请在三一办公上搜索。
1、6.6有向图的DFS算法与图的块划分,DFS(depth first search深度优先搜索)在2.2中判断二点之间是否连续时使用过:从某一点出发v0,找v0一个直接下代v1,father(v1)=v0,找v1未搜索的直接后继v2,father(v2)=v1,当vj没有未搜索后代时,回到father(vj),找vj父结点的另一个未搜索后代,直到不能搜索后再退回到上一级。可用栈记录搜索过程,现提出更加详细的算法,并用来解决有向图的分块问题。,当从结点v选择一条未检查边时可能:(1)w未访问,则为树边;(2)w已访问,则:(2.1)DFS森林中w是v的子孙,是向前边;(2.2)DFS森林中w是v
2、的祖先,是回退边;(2.3)DFS森林中w与v无关,且dfn(w)是横跨边;无关,且w先于v访问,只能dfn(w)dfn(v),当从结点v选择一条未检查边时可能:(1)w未访问,则为树边;(2)w已访问,则:(2.1)在DFS森林中w是v的子孙,是向前边;(2.2)在DFS森林中w是v的祖先,是回退边;(2.3)在DFS森林中w与v无关且dfn(w)是横跨边;只有4种边。若dfn(w)dfn(v)即w晚于v访问,则为树边/向前边 若dfn(w)dfn(v)即w早于v访问,则为回退边或横跨边,编程实现时,需要的数组为:(1)已访问结点的数组MARK(2)已访问点的父结点的数组FATHER(3)深
3、度优先指标数组DFN。仅在结点x第一次被访问时给DFN(x)赋值。如果x是第i个被赋值的结点,则DFN(x)=I(4)点的边是否全扫描SCAN,区分回退边与横跨(5)树边(同棵树中结点首次访问所用边)TREE。(6)向前边(同树,指向晚访问点边)FORWARD。(7)回退边(同树,指向早访问点的边)BACK。(8)横跨边(指向前棵中早已访问的边CROSS(9)边已访问EDGE,1.Tree=Cross=Back=Forward=,i=1,Father(v)=0,Mark(v)=0,Scan(v)=0,dfn(v)=0,edge(e)=02.任选满足Mark(r)=0的结点r(确定新根),置其
4、DFN(r)=i,Mark(r)=1,v=r(当前结点)3.若以v起点的边都已查,scan(v)=1转5,否则任选未查边(v,w)转44.边(v,w)标为已查Edge(v,w)=1,执行以下操作后回到3 4.1若Mark(w)=0(未访),则 i=i+1,DFN(w)=i,Tree=Tree Mark(w)=1,father(w)=v,v=w(修改新当前结点)4.2 若Mark(w)=1(已访),若DFN(w)DFN(v)(w晚)则Forward=Forward 若DFN(w)若DFN(w)5.若fahter(v)0(不是根)则v=fahter(v)转3,否则转66.若所有结点Mark(x)=
5、1结束,否i=i+1转2,1.Tree=Cross=Back=Forward=,i=1,Father(v)=0,Mark(v)=0,Scan(v)=0,dfn(v)=0,edge(e)=02.r=1 mark(1)=1 dfn(1)=1,v=13.任选未查边4.标记已查edge()=1 因mark(2)=0,故i=2,mark(2)=1,dfn(2)=2,father(2)=1,v=2,Tree=回到33.任选未查边4.标记已查edge()=1.,3.任选未查边4.标记已查edge()=1 因mark(2)=0,故i=2,Tree=,mark(2)=1,dfn(2)=2,father(2)=1
6、,v=2 回到33.任选未查边4.标记已查edge()=1.因mark(3)=0,故i=3,mark(3)=1,Dfn(3)=3,father(3)=2,v=3,Tree=,回到33.任选未查边,3.任选未查边4.标记已查edge()=1.因mark(3)=0,故i=3,Tree=,mark(3)=1,Dfn(3)=3,father(3)=2,v=3 回到33.任选未查边4.标记已查edge()=1.因mark(4)=0,故i=4,Tree=,mark(4)=1,dfn(4)=4,father(4)=3,v=4 回到33.以4为起点都已查,scan(4)=1,转5,4.标记已查edge()=1
7、.因mark(4)=0,故i=4,Tree=,mark(4)=1,dfn(4)=4,father(4)=3,v=4 回到33.以4为起点都已查,scan(4)=1,转55.father(4)=30,则v=father(4)=3,转3。3.任选未查边,转4。4.标记边已查edge()=1,因mark(5)=0,故i=5,Tree=,mark(5)=1,dfn(5)=5,father(5)=3,v=5 转3.,5.father(4)=30,则v=father(4)=3,转3。3.任选未查边,转4。4.标记边已查edge()=1,因mark(5)=0,故i=5,Tree=,mark(5)=1,dfn
8、(5)=5,father(5)=3,v=5 转3.3.任选未查边,转44.标记已查edge()=1,因mark(2)=1,dfn(2),回到3.,3.任选未查边,转44.标记已查edge()=1,因mark(2)=1,dfn(2),回到3.3.以v=5为始点的边都已查,scan(5)=1,转5.5.father(5)=30,则v=father(5)=3,转3.3.以v=3为始点的边都已查,scan(3)=1,转55.father(3)=20,则v=father(3)=2,转33.任选未查边,转4.,5.father(3)=20,则v=father(3)=2,转33.任选未查边,转4.4.标记边
9、已查edge()=1.因mark(6)=0则i=6,mark(6)=1,dfn(6)=i=6,father(6)=2,Tree=,v=6 转33.任选未查边,转44.标记边已查edge()=1.因mark(7)=0,故i=7,mark(7)=1,dfn(7)=7,father(7)=6,Tree=,v=7 转3,4.标记边已查edge()=1.因mark(7)=0,故i=7,mark(7)=1,dfn(7)=7,father(7)=6,Tree=,v=6 转33.以7为起点边都已查完,故scan(7)=1,转5.5.father(7)=60,故v=father(7)=6,转33.任选未查边,转
10、44.标记已查,因mark(4)=1,dfn(4),转3,4.标记已查,因mark(4)=1,dfn(4),转33.以v=6为起点的边都已查完,故scan(6)=1,转5.5.father(6)=20,故v=father(6)=2,转33.以v=2为起点的边都已查完,故scan(2)=1,转55.father(2)=10,故v=father(2)=1,转3,5.father(2)=10,故v=father(2)=1,转33.任选未查边,转44.标记已查edge()=1,因mark(4)=1,DFN(4)DFN(1),故Forward=,回到3.3.任选未查边,转44.标记已查edge()=1,
11、因mark(7)=1,DFN(7)DFN(1),故Forward=,回到3.3.因以1为起点的边都已查完,故scan(1)=1,转55.因father(1)=0为根,转6,5.因father(1)=0为根,转66.因为有些结点未访问,故i=8,转22.选满足mark(r)=0的点r=8,mark(8)=1,dfn(8)=8,v=83.任选未查边,转44.标记已查edge()=1,因mark(9)=0,故i=9mark(9)=1,dfn(9)=9,father(9)=8,v=9Tree=,转33.任选未查边,转4.4.标记已查edge()=1,因mark(10)=0,故,4.标记已查edge()
12、=1,因mark(10)=0,故 i=10,mark(10)=1,dfn(10)=10,father(10)=9,v=10Tree=,转33.任选未查边,转4.4.标记已查edge()=1,因mark(11)=0,故i=11,mark(11)=1,dfn(11)=11,father(11)=10,v=11Tree=,转3,4.标记已查edge()=1,因mark(11)=0,故i=11,mark(11)=1,dfn(11)=11,father(11)=10,v=11Tree=,转33.任选未查边,转44.标记已查edge()=1,因mark(6)=1,dfn(6),回到3.3.任选未查边,转4
13、4.标记已查edge()=1,因mark(9)=1,3.任选未查边,转44.标记已查edge()=1,因mark(9)=1,dfn(9),转33.以v=11为起点的边都已查完,scan(11)=1,转55.father(11)=100,故v=father(11)=10,转3.3.任选未查边,转44.标记已查edge()=1,因mark(12)=0故i=12,mark(12)=1,dfn(12)=12,father(12)=10,v=12Tree=,转3,4.标记已查edge()=1,因mark(12)=0故i=12,mark(12)=1,dfn(12)=12,father(12)=10,v=1
14、2Tree=,转33.以v=12为起点边都已查完,scan(12)=1,转55.因father(12)=100,故v=father(12)=10,转33.因v=10为起点边都已查完,scan(10)=1,转55.因father(10)=90,故v=father(10)=9,转33.任选未查边,转4,3.任选未查边,转44.标记已查edge()=1,因mark(12)=1,dfn(12)dfn(9),则forward=,回33.以9为始点边都已查完,scan(9)=1,转55.因father(9)=80,故v=father(9)=8,转3.3.以8为始点边都已查完,scan(8)=1,转55.因
15、father(8)=0,转66.因为有点未访问,故i=i+1,转22.选满足mark(r)=0的点v=13,mark(13)=1,dfn(13)=13,6.因为有点未访问,故i=i+1,转22.选满足mark(r)=0的点v=13,mark(13)=1,dfn(13)=133.任选未查边,转44.标记已查edge()=1,因mark(8)=1,dfn(8),转33.任选查边,转44.标记已查edge()=1,因mark(9)=1,dfn(9),转3,3.任选未查边,转44.标记已查edge()=1,因mark(9)=1,dfn(9),转33.任选未查边,转44.标记已查edge()=1,因ma
16、rk(12)=1,dfn(12),转33.因以13为始边已查,scan(13)=1,转55.因father(13)=0,转66.因所有点mark(v)=1,故结束.3个根即3棵树,红实边为树,粗虚为向前边,细虚为回退,黑线为横跨边,从如下的DFS过程可知,原图是弱连通(看成无向图时连通)时,DFS是不连通的.定理6.6.1 强连通图的DFS林是连通的.证明:假设DFS林不连通,则至少有2棵子树T1,T2.设r1,r2是其根,r1r2,T1先于T2得到.由深度优先算法的特点可知,不存在起点在T1,终点在T2的边.故从r1不能到达T2的各结点,故不是强连通的!矛盾,故假设错.,从如下的DFS过程可
17、知,原图是弱连通(看成无向图时连通)时,DFS是不连通的.定理6.6.1 强连通图的DFS林是连通的.定义6.6.1 有向图G极大的强连通子图称为它的强连通分量,或强连通块.推论6.6.1 对于G的强连通分量的DFS子树是连通的.设G1=(V1,E1),G2=(V2,E2).,Gk=(Vk,Ek)是G的强连通块。T是G的DFS树,T1,T2,.,Tk是对应强连通块的子树。r1,r2,rk是这些子树的根!确定强连通块Gi的根ri是算法的关键.为此分析G中诸边间的关系.,确定强连通块Gi的根ri是算法的关键.。(1)若vVi,wVj,ij,则边不可能是回退边,由回退边的定义可知,始点在Vi的回退边
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DFS 分块 汇总 课件

链接地址:https://www.31ppt.com/p-2175357.html