Introduction to Algorithms (Depth-First Search, Topological Sort)

 

Depth-First Search (DFS)

recursively explore graph, backtracking as necessary

parent = {s: None}

DFS-Visit(V, Adj, s):
    for v in Adj[s]:
        if v not in parent
            parent[v] = s
            DFS-Visit(V, Adj, v)

DFS(V, Adj):
    parent = {}
    for s in V:
        if s not in parent:
            parent[s] = None
            DFS-Visit(V, Adj, s)

Analysis: O(E + V)

Edge Classification:

  • tree edge: (parent pointer) visit new vertex via edge
  • forward edge: node -> descendant in tree
  • backward edge: node -> ancestor in tree
  • cross edges: between two non-ancestor-related subtrees

Cycle detection:

 G has a cycle <=> DFS has a back edge

Topological Sort

Reverse of DFS finishing times (time at which DFS-Visit(v) finishes)

Correctness

For any edge (u, v) — u ordered before v, i.e., v finished before u

  • if u visited before v: before visit to u finishes, will visit v (via (u, v) or otherwise), v finishes before u
  • if v visited before u: graph is acyclic, u cannot be reached from v, visit to v finishes before visiting u
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值