DFS应用——遍历有向图+判断有向图是否有圈

【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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AbleCloud智能行业解决方案助力体重秤企业向“中国智造”转变

近年来&#xff0c;体重秤消费群体的年龄层次与需求逐渐向多元化发展&#xff0c;品牌众多、竞争激烈的传统体重秤行业迎来了前所未有的挑战——智能体重秤成为行业发展的大趋势&#xff0c;功能单一、同质化严重已经成为阻碍传统体重秤企业成长的桎梏&#xff0c;打造出具备“…

javaScript事件(一)事件流

一、事件 事件是文档或者浏览器窗口中发生的&#xff0c;特定的交互瞬间。 事件是用户或浏览器自身执行的某种动作&#xff0c;如click,load和mouseover都是事件的名字。 事件是javaScript和DOM之间交互的桥梁。 你若触发&#xff0c;我便执行——事件发生&#xff0c;调用它的…

php输入对话框,如何使用JavaScript实现输入对话框

我们有时在网页上进行注册用户信息时会出现弹窗进行提示&#xff0c;你需要输入内容进行确认&#xff0c;那么&#xff0c;这样的输入对话框是怎么实现的呢&#xff1f;本篇文章就来介绍关于使用JavaScript实现输入对话框的方法。我们可以使用prompt显示输入对话框要在JavaScri…

软件缺陷的种类划分

按照软件缺陷的产生原因&#xff0c;可以将其划分为不同的缺陷类别&#xff1a; 1、功能不正常 简单地说就是所应提供的功能&#xff0c;在使用上并不符合产品设计规格说明书中规定的要求&#xff0c;或是根本无法使用。这个错误常常会发生在测试过程的初期和中期&#xff0c;有…

python——no module named XX

加PYTHONPATH吧&#xff0c;新建一个系统环境变量&#xff0c;把你的目录复制进去即可转载于:https://www.cnblogs.com/MarsMercury/p/4992629.html

CodeVS 1081 线段树练习 2

1081 线段树练习 2 时间限制: 1 s空间限制: 128000 KB题目等级 : 大师 Master题目描述 Description给你N个数&#xff0c;有两种操作 1&#xff1a;给区间[a,b]的所有数都增加X 2&#xff1a;询问第i个数是什么&#xff1f; 输入描述 Input Description第一行一个正整数n&#…

bzoj4144 [AMPPZ2014]Petrol 图论 最短路 并查集

bzoj4144 [AMPPZ2014]Petrol 图论 最短路 并查集 1、这道题我们主要就是要求出距离一个油站的最近的油站 首先我们dijkstra 求出任意一个点到 离他最近的油站的距离 2、然后会发现 如果一条边的两个端点 的最近油站不同的话 那么这条边就会在这两个油站的最短路上 3、然后对于…

python函数理解,python对函数的理解

函数函数可以提高编写代码效率、代码的重用、让程序更小、模块化可以将一段独立功能的代码集成在一个块中、封装独立功能# 函数定义(参数名为形式参数)def 函数名(参数名):函数体# 调用函数(享受封装的成功)函数名(实际参数)例&#xff1a;print函数print(sep,end) sep(元素中分…

06:空格分隔输出

描述 读入一个字符&#xff0c;一个整数&#xff0c;一个单精度浮点数&#xff0c;一个双精度浮点数&#xff0c;然后按顺序输出它们&#xff0c;并且要求在他们之间用一个空格分隔。输出浮点数时保留6位小数。 输入共有四行&#xff1a;第一行是一个字符&#xff1b;第二行是一…

iOS开发UI篇—九宫格坐标计算

iOS开发UI篇—九宫格坐标计算 一、要求 完成下面的布局 二、分析 寻找左边的规律&#xff0c;每一个uiview的x坐标和y坐标。 三、实现思路 (1)明确每一块用得是什么view (2)明确每个view之间的父子关系&#xff0c;每个视图都只有一个父视图&#xff0c;拥有很多的子视图。 (3)…

工业4.0时代企业如何用CRM实现模式变革

当前&#xff0c;全球经济正处于变革的巨大浪潮之中&#xff0c;对于制造业来说&#xff0c;德国提出工业4.0&#xff0c;美国提出工业互联网&#xff0c;而我国&#xff0c;正在大力推进“中国制造2025”。制造业实现转型升级势在必行。我国政府提出&#xff0c;要大力支持传统…

oracle 9.2.0.2,在RedHat enterprise server 3 安装oracle9i 2.0.0.1 并升级到9.2.0.6

oracle9i 2.0.4上个月从oracle网站下载没有安装在els3上。参考了网上的一些文章&#xff0c;并根据文章的提示找了一些资料和补丁&#xff0c;完成了这次的安装。[more]1.安装RedHat EL3现在的安装界面都做的很好了,一路NEXT就可以安装了.如果有困难,请参考其他linux安装文档进…

spring -mvc 将对象封装json返回时删除掉对象中的属性注解方式

spring -mvc 将对象封装json返回时删除掉对象中的属性注解方式 在类名,接口头上注解使用在 JsonIgnoreProperties(value{"comid"}) //希望动态过滤掉的属性 例 JsonIgnoreProperties(value{"comid"}) public interface 接口名称{ } JsonIgnorePro…

HawkHost老鹰主机更换主域名方法

http://www.yd631.com/change-hawkhost-primary-domain/圣诞节优惠期间&#xff0c;很多童鞋们购买了老鹰主机&#xff0c;可能由于大家初次使用海外主机或者是CP面板的空间。购买主机的时候主域名是随便输入的或者是输入后想换一个。我们可以通过以下方法进行操作。之前我们QQ…

ERP CRM与SCM整合过程中的知识转移

ERP(Enterprise Resource Planning&#xff0c;企业资源计划)、CRM(Customer Relationship Management&#xff0c;客户关系管理)、SCM、CRM(Customer Relationship Management&#xff0c;客户关系管理)、SCM(supply chain management&#xff0c;供应链管理)作为现代企业管理…

ubuntu 64 12.04 oracle,ubuntu server 12.04 x86_64 下安装oracle xe 11 x86_64

1.下载oracle xe我下载的是oracle-xe-11.2.0-1.0.x86_64.rpm.zip2. 安装必要程序或文件$sudo apt-get install unzip chkconfig libaio1 alien3.解压上面的oraclexxx.zip文件,然后进行转换$sudo alien -d --scripts oracle-xe-11.2.0-1.0.x86_64.rpm上面转换完成后会生成一个 o…

IEnumerable 遍历用法

咋一看到IEnumerable这个接口&#xff0c;我们可能会觉得很神奇&#xff0c;在一般的编程时&#xff0c;基本上我们是想不到去用它的&#xff0c;可是&#xff0c;俗话说得好&#xff0c;存在便是道理&#xff0c;那么&#xff0c;它对我们来说&#xff0c;能够带来哪些奇妙的事…

DELPHI设置枚举类型size

delphi枚举类型长度默认为2个字节(单字)&#xff0c;而在C中枚举为4个字节(双字)&#xff0c;如果需要跨这两个平台编程&#xff0c;传输结构时会由于数据长度不一造成灾难。 经过查找资料&#xff0c;原来delphi可以通过{$Z} {$Z-} {$Z1} {$Z4} 等宏设置枚举类型的长度&#x…

Nginx 反向代理 websocket 协议

为什么80%的码农都做不了架构师&#xff1f;>>> 主要配置内容 server {listen 80;server_name xxx.xxx.xxx;location / {try_files $uri $uri/ /index.html;root /workspace/www;index index.html index.htm;}location ^~/letchat/ {proxy_pass http:/…

oracle中区间大小,Oracle的逻辑结构(表空间、段、区间、块)——总结

Oracle逻辑结构全景结构图以下为个人整理的一些关于Oracle逻辑结构的相关数据字典&#xff1a;SELECT * FROMDBA_TABLESPACES--记录各个表空间的详细信息SELECT * FROMDBA_TABLESPACE_USAGE_METRICS--记录各个表空间的使用状况SELECT * FROMDBA_DATA_FILES --记录各个数据文件的…