【0】README

0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 “DFS应用——遍历有向图+判断有向图是否有圈” 的idea 并用源代码加以实现 ;
0.2) 判断有向图是否有圈的rule—— 一个有向图是无圈图当且仅当它没有背向边,背向边定义,参见: http://blog.csdn.net/pacosonswjtu/article/details/49967255 
0.3) 代码最后还添加了打印dfs遍历路径所产生的集合, 对的,dfs 就应该这么玩,Bingo!


【1】有向图相关

1.1)对有向图进行DFS的idea:利用与无向图相同的思路, 也可以通过深度优先搜索以线性时间遍历有向图。如果图不是强连通的,那么从某个节点开始的DFS可能访问不了所有的节点。在这种情况下, 我们在某个未作标记的节点处开始,反复执行DFS, 直到所有节点都被访问到;
1.2)基于以上描述, 我们看个荔枝(这只是一种可能的case):

  • step1)从顶点B 任意开始深度优先搜索, 访问顶点B, C, A, D, E;
  • step2)从顶点 F 任意开始DFS, 访问顶点 F;
  • step3)从顶点 H 任意开始DFS, 访问顶点 H, J, I;
  • step4)从顶点 G 任意开始DFS, 访问顶点 G;

1.3)对于以上的DFS过程, 对应的搜索优先搜索树如下图所示:

对上图的分析(Analysis):

  • A1)深度优先生成森林中虚线箭头是一些(v, w)边, 其中的w 在考察时已经做了标记;
  • A2)我们看到,存在三种类型的边并不通向新顶点:
    • A2.1)背向边:如(A,B) 和 (I,H);
    • A2.2)前向边:如(C,D) 和 (C,E), 它们从树的一个节点通向一个后裔;
    • A2.3)交叉边:如(F,C)和(G,F), 它们把不直接相关的两个树节点连接起来;
  • A3)深度优先搜索森林一般通过吧一些子节点和一些新的树从左到右添加到森林中形成。 在以这种方式构成的有向图的深度优先搜索中,交叉边总是从右到左进行的;

1.4)深度优先搜索(DFS)的一个用途是: 检测一个有向图是否是无圈图;

  • 4.1) 法则如下: 一个有向图是无圈图当且仅当它没有背向边;(上面的图有背向边, 因此它不是无圈图)
  • 4.2)拓扑排序也可以用来确定一个图是否是无圈图。进行拓扑排序的另一种方法是通过深度优先生成森林的后序遍历给顶点指定拓扑编号N, N-1, ..., 1; 只要图是无圈的,这种排序就是一致的;

【2】source code + printing results(此处的dfs是对原始dfs修改而成的,与原始的dfs不同,但idea一样)

2.1)download source code:  https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter9/p248_dfs_directed_graph
2.2)source code at a glance:(for complete code , please click the given link above)

void dfs(Vertex vertex, int depth)
{int i;int visitFlag;AdjTable temp;Vertex adjVertex;   //printf("\n\t visited[%c] = 1 ", flag[vertex]);visited[vertex] = 1; // update visited status of vertexvertexIndex[vertex] = counter++; // number the vertex with countertemp = adj[vertex]; visitFlag = 0;  while(temp->next){            adjVertex = temp->next->vertex;     if(visited[adjVertex]) // judge whether the adjVertes was visited before        {if(vertexIndex[vertex] > vertexIndex[adjVertex] && parent[vertex] != adjVertex)     {parent[adjVertex] = vertex; // building back side, attention of condition of building back side above// just for printing effectfor(i = 0; i < depth; i++)  printf("      ");printf("  v[%c]->v[%c] (backside) \n", flag[vertex], flag[adjVertex]);}           }//if(!visited[adjVertex])else{if(vertex == start)visitFlag = 1;parent[adjVertex] = vertex;// just for printing effectfor(i = 0; i < depth; i++)  printf("      ");           printf("  v[%c]->v[%c] (building edge) \n", flag[vertex], flag[adjVertex]);dfs(adjVertex, depth+1);}if(vertex == start && visitFlag) //conducingt dfs for only one adjoining vertex in the given graphbreak;  temp = temp->next;  }
} 

2.3)printing results(第二张图是对第一张图的补充,我最后添加了 dfsPathSet 方法打印出上述dfs遍历路径所产生的集合):

转载于:https://www.cnblogs.com/pacoson/p/4990616.html

DFS应用——遍历有向图+判断有向图是否有圈相关推荐

  1. 两种方法判断有向图是否有环【DFS】【拓扑排序】

    方法1:DFS判断有向图是否有环 对一个节点u进行DFS,判断是否能从u回到自己这个节点,即是否存在u到u的回路. color数组代表每个节点的状态 -1代表还没访问,0代表正在被访问,1代表访问结束 ...

  2. 图8——判断有向图中是否有根

    在有向图G中,如果r到G中每个结点都有路径可达,则称结点r为G的跟结点.编写一个算法判断有向图G中是否有根,如果有则打印出所有根节点的值. [分析] 这是东北大学和浙江大学的考研试题.主要考查对图的深 ...

  3. 两种方式判断有向图是否有环-python实现

    1. DFS判断有向图是否有环 假设图以邻接矩阵表示,一条深度遍历路线中如果有结点被第二次访问到,那么有环.我们用一个变量来标记某结点的访问状态(未访问,访问过,其后结点都被访问过),然后判断每一个结 ...

  4. 算法提高课-图论-欧拉回路和欧拉路径-AcWing 1185. 单词游戏:判断有向图是否存在欧拉路径、并查集

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 把每个单词看成一条边!!!首字母到尾字母的一条边,最多共有26个点(26个小写的英文字母),然后问能否把所有边串起来. 其实,对欧拉 ...

  5. 判断有向图G是否有根

    在有向图G中,如果r到G中的每个结点都有路径可达,则称结点r为G的根结点.编写一个算法判断有向图G是否有根,若有,则打印出所有根结点的值. 在这里插入代码片 int num=0,visted[]=0 ...

  6. hrbust 哈理工oj 1633 word!word!【欧拉路、欧拉回路的有向图判断】

      word!word! Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 58(20 users) Total Accepted: 25 ...

  7. DFS应用——遍历无向图

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 如何对无向图进行深度优先搜索 的idea 并用源代码加以实现: 0.2) 本文还引入了 背向边(定义见下文 ...

  8. 用两种遍历方法判断图中两点是否有路径

    用两种遍历方法判断图中两点是否有路径(可直接测试) 邻接表.图.图的两种遍历以及图中路径的基本概念,可以去自行了解和学习(下面是代码实践)可直接在自己主机测试 #include <iostrea ...

  9. C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例

    C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判 ...

最新文章

  1. jQuery EasyUI使用教程之使用标记创建树形菜单
  2. hello rocketMQ
  3. JS 正则匹配字符串
  4. Java_io体系之BufferedWriter、BufferedReader简介、走进源码及示例——16
  5. vscode 设置保存格式化,当保存时,单引号变成了双引号,vue项目报错
  6. 12333新农合网上查询_新农合医保查询缴费平台|新农村医疗保险网上缴费平台
  7. i 智慧 | 计算产业发展黄金10年 腾讯云弹性计算抢占计算蓝海
  8. Atitit.执行cli cmd的原理与调试
  9. Android编程权威指南学习:Activity之间传递参数
  10. 力扣226. 翻转二叉树(JavaScript)
  11. 在 vCenter Server 中触发了 vSphere Distributed Switch 绑定警报 (2057667)
  12. 10 月全国程序员工资统计,一半以上的职位 5 个月没招到人!
  13. 前端本地使用线上数据
  14. 高阶java_Java高阶语法---final
  15. pytorch---之BN层参数详解及应用(1,2,3)(1,2)?
  16. pyhive 安装sasl
  17. docker 下安装oracle
  18. python内置函数用来打开或创建文件并返回文件对象_python内置函数
  19. 手机OTG 我的世界_关于旧安卓手机改用为门禁探头、监控摄像头方案
  20. Ultraedit删除空白行

热门文章

  1. 芯片:设计、制造、封测
  2. DNN、CNN、RNN、LSTM的区别
  3. 动画理解Dijkstra算法过程
  4. mysql 8.0数据备份恢复_MySQL 8.0 增强逻辑备份恢复工具介绍-爱可生
  5. react usecontext_鬼才!我居然把 Vue3 的原理用到了 React 上?
  6. 计算机机房用户不规则行为,网络及网管机房管理理论练习
  7. java 实体类 临时注解_JPA:Java持久层API--配置流程
  8. mysql zero fill_mysql zerofill 的使用
  9. 2021 icme_重磅 | 2021年U.S. News 全美院校排名发布,疫情之下,排名大洗牌?!
  10. [FY20 创新人才班 ASE] 第 1 次作业成绩