【数据结构C语言】深度优先遍历DFS检查无向图和有向图回路

【待更新...】

对天勤数据结构课后习题的深度思考:

问题:T218 1.(2) 

解答:T226 

1)有向图 在DFS的visited[]数组0,1状态上进行扩充,0表示为访问过,1表示已访问但还没监测完这个顶点可能出现的回路(即还没退出系统栈,处于有子结点还在访问的状态),2表示该结点已经退出系统栈(即不在递归层中)。进入DFS函数对v访问时,标记为1,然后访问子结点,如果子结点被访问过了,且子结点访问状态为1则表示有回路,如果子结点状态为2,则过滤掉这个结点。在即将退出递归层时,将结点标记为2,然后退出系统栈,返回上一层。 

2)无向图 存在双向边的情况

1.对于无向图

如果在DFS过程中检查到回边存在两种情况:

1)存在环

2)存在双向边。此时要过滤掉双向边。在DFS函数外部设置变量i,编号数组no[N],并初始化为0。进入DFS时,i++(表示来到了一个新的双亲结点),访问某个顶点a,给它编号i,然后访问孩子结点b,如果孩子结点b未访问过,则在DFS递归之前将b的编号设置为i+1。如果访问过程中来到一个结点c,它的孩子结点d已经被访问过,且d的编号+1等于c的编号,证明为双向边,否则为

  • 18
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值