DFS(G)//以邻接链表形式输入
//v.d第一次访问时    v.f邻接链表访问完时    v.color状态变化,WHITE 为访问;GRAY第一次;BLACK邻接链表访问结束     v.pa父顶点    Adj[v]顶点的邻接链表    time记录以给v.d v.f  
<span style="font-family: Arial, Helvetica, sans-serif;">for all v in G </span>
<span style="font-family: Arial, Helvetica, sans-serif;">v.color=WHITE v.d=0 v.f=0 v.pa=NIL </span>
<span style="font-family: Arial, Helvetica, sans-serif;">time=0</span>
for all v in G
  if v.color==WHITE DFS-VISIT(G,v)
DFS-VISIT(G,v)
time=time+1
v.color=GRAY v.d=time 
for all u in Adj[v]
  if u.color==WHITE
    u.pa=v
    DFS-VISIT(G,u)
time=time+1;u.f=time;u.color=BLACK

分析时空复杂度:V点 E边 DFS中初始化for为O(V);DFS-VISIT  每个顶点访问一次,邻接链表没有未访问顶点则返回父顶点;根顶点也没有则找到另一源为WHITE的顶点
c*V。 对边来说,在for里pa的赋值O(E)。因而O(V+E)

由v.d v.f记录的区间可以得知后代关系。

u是v的后代,当仅当v.d之时,有白色路径从节点u到v。

从DFS的角度对中的边进行分类:后向边(后代指向祖先且有向图的自循环也被认为是后向边),前向边(祖先指向后代),树边(森林中树内部),横向边(其他:有森林中树兄弟指向/树与树之间的节点指向)。有向图四种都可能有.

无向图只可能有两种边:树边和后向边。pr:(v,u) v.d<u.d 则进行访问时,v为白色被访问先于u 一种可能是返回到v时u仍WHITE,也可能返回时已经是GRAY,可否能是BLACK?如果是BLACK则v.f>u.f则u是v的后代,边为后向边。如果是WHITE则为树边。如果是GRAY,那么v一定是GRAY,仍是后向边。也可以从边的角度分析。

在DFS过程中边(v,u),第一次访问某u如果为WHITE 则树边,GRAY后向边,BLACK则为前向(v.d<u.d)或横向(v.d>u.d)。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值