【待更新...】
对天勤数据结构课后习题的深度思考:
问题: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的编号,证明为双向边,否则为

本文介绍了如何使用C语言实现深度优先遍历DFS来检查无向图和有向图是否存在回路。在有向图中,通过visited[]数组的状态管理来判断回路;在无向图中,通过编号数组no[N]过滤掉双向边,区分回路与双向边。详细阐述了算法思路,并给出了核心代码示例。
最低0.47元/天 解锁文章
6657

被折叠的 条评论
为什么被折叠?



