这是图论的基础知识点,也是学习Tarjan的导学课。
一、知识
对于在图G上进行深度优先搜索算法所产生的深度优先森林Gt,我们可以定义四种边的类型:

1.树边(Tree Edge):为深度优先森林中Gt的边。如果结点v是因算法对边(u,v)的搜索而首先被发现,则(u,v)是一条树边。
2.后向边(Back Edge):后向边(u,v)是将结点u连接到其在深度优先树中(一个)祖先结点v的边,由于有向图中可以有自循环,自循环也被认为是后向边。
3.前向边(Forward Edge):是将结点u连接到其在深度优先树中一个后代结点v的边(u,v)。
4.横向边(Cross Edge):指其他所有的边。这些边可以连接同一棵深度优先树中的结点,只要其中一个结点不是另外一个结点的祖先,也可以连接不同深度优先树中的两个结点。
附图:
二、方法
我们采取时间戳的思想:不会戳这里。
1.我们根据深度优先搜索的基本操作需要一个记录顶点相连的标志,也就是edge[][]的一个二维数组, 然后,在遍历各个顶点的过程中将遇到的可以访问的edge设置为-1(初始化为0,输入时置为1)也就是已经访问过了, 至此,我们的树就会生成,但是我们需要记录其中不同边的特性,所以,我们增加两个标志位pre,post来记录开始和结束的时间点, 这个时间点起始点为0. 每当进行一次遍历则会将对应的时间点记录到相应顶点的pre和post中去,因此,我们可以有这样的想法: 1、需要判断一条边为back edge的话,只需要查看其相连顶点的post是否存在就可以了,因为从上到下的搜索过程中,只有该顶点结束搜索才会设置相应的结束时间 因而如果当前顶点的遍历都没有结束那么说明与该点相连的顶点形成的边是一条bakc edge。
2.从刚刚到back edge判断中我们可以联想发现,如果当前的顶点需要遍历且相连顶点的pre(开始时间)比当前顶点的pre高,说明这条边跳过一些时间点直接到此点 而且还是从较早到时间点跳转到较晚的时间点,因此这样的一条边是一条down edge。 3、可想而知如果一个顶点遍历的开始时间点远远大于另外一个顶点点话,这样形成的一条边自然就是cross edge了。

#include<iostream>
#include<queue>
#include<algorithm>
#include<set>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<bitset>
#include<cstdio>
#include<cstring>
//---------------------------------Sexy operation--------------------------//#define cini(n) scanf("%d",&n)
#define cinl(n) scanf("%lld",&n)
#define cinc(n) scanf("%c",&n)
#define cins(s) scanf("%s",s)
#define coui(n) printf("%d",n)
#define couc(n) printf("%c",n)
#define coul(n) printf("%lld",n)
#define debug(n) printf("%d_________________________________\n",n);
#define speed ios_base::sync_with_stdio(0)
#define file  freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)
//-------------------------------Actual option------------------------------//
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define Swap(a,b) a^=b^=a^=b
#define Max(a,b) (a>b?a:b)
#define Min(a,b) a<b?a:b
#define mem(n,x) memset(n,x,sizeof(n))
#define mp(a,b) make_pair(a,b)
#define pb(n)  push_back(n)
#define dis(a,b,c,d) ((double)sqrt((a-c)*(a-c)+(b-d)*(b-d)))
//--------------------------------constant----------------------------------//#define INF  0x3f3f3f3f
#define esp  1e-9
#define PI   acos(-1)
using namespace std;
#define maxn 1020
#define INF 0x3f3f3f3fusing namespace std;
int pre[101],post[101],edge[101][101],parent[101];
int tag;
void dfs_tag(int cur,int n){pre[cur]=++tag;for(int i=0;i<n;i++){if(edge[cur][i]==1){if(pre[i]==0){parent[i]=cur;edge[cur][i]=-1;dfs_tag(i,n);}else{if(post[i]==0){edge[cur][i]=-2;}else if(pre[i]>pre[cur]){edge[cur][i]=-3;}else{edge[cur][i]=-4;}}}}post[cur]=++tag;
}
void dfs(int n){memset(pre,0,sizeof(pre));memset(post,0,sizeof(post));memset(parent,-1,sizeof(parent));for (int i = 0; i < n; ++i){if(parent[i]==-1)dfs_tag(i,n);}
}int main(){int n,m;int u,v;int cases;tag=0;cin>>m>>n;for (int i = 0; i < m; ++i){cin>>u>>v;edge[u][v]=1;}dfs(n);cin>>cases;while(cases--){cin>>u>>v;switch(edge[u][v]){case -1:printf("edge (%d,%d) is Tree Edge\n",u,v);break;case -2:printf("edge (%d,%d) is Back Edge\n",u,v);break;case -3:printf("edge (%d,%d) is Down Edge\n",u,v);break;case -4:printf("edge (%d,%d) is Cross Edge\n",u,v);break;}}
}

DAG的深度优先搜索标记相关推荐

  1. Python图算法之深度优先搜索

    深度优先搜索(Depth First Search, DFS): 是一种用于遍历或搜索树或图的算法.沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发现节点 ...

  2. 深度优先搜索_0基础学算法 搜索篇第一讲 深度优先搜索

    0基础学算法 搜索篇第一讲 深度优先搜索 相信绝大多数人对于深度优先搜索和广度优先搜索是不会特别陌生的,如果我这样说似乎你没听说过,那如果我说dfs和bfs呢?先不说是否学习过它们,至少它们的大名应该 ...

  3. leetcode dfs_深度优先搜索:具有6个Leetcode示例的DFS图遍历指南

    leetcode dfs Have you ever solved a real-life maze? The approach that most of us take while solving ...

  4. 【ACM】杭电OJ 1241(深度优先搜索小结)

    题目链接:杭电OJ 1241 深度优先搜索问题 深度优先搜索是搜索的手段之一.它从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直至找到最终的解. ...

  5. matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

  6. c++输出方块_C/C++编程笔记:DFS 深度优先搜索的基本思想,含实例讲解

    采用搜索算法解决问题时,需要构造一个表明状态特征和不同状态之间关系的数据结构,这种数据结构称为结点.不同的问题需要用不同的数据结构描述. 根据搜索问题所给定的条件,从一个结点出发,可以生成一个或多个新 ...

  7. networkx 有向图强连通_leetcode刷题(四):搜索(深度优先搜索,广度优先搜索)拓扑排序,强连通分量...

    在开始今天的话题之前,我们先了解一个概念,什么是图的遍历? 图的遍历就是从图中某一点出发访遍图中其余剩余定点,且每个顶点仅被访问一次,这个过程叫做图的遍历. 图的遍历主要被分为深度优先遍历和广度优先遍 ...

  8. 深度优先搜索找迷宫的出路

    3. 深度优先搜索 现在我们用堆栈解决一个有意思的问题,定义一个二维数组: int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, ...

  9. 图的深度搜索c语言,求图的深度优先搜索!该怎么处理

    当前位置:我的异常网» C语言 » 求图的深度优先搜索!该怎么处理 求图的深度优先搜索!该怎么处理 www.myexceptions.net  网友分享于:2013-03-16  浏览:12次 求图的 ...

最新文章

  1. flash中物体运动基础之三---------摩擦力,重力,风力,推力,旋转
  2. BigMemroy系列文章--11. BigMemory中的SizeOf问题
  3. Android关机流程源码分析
  4. 绝对定位元素设置水平居中
  5. java hashmap 添加_JAVA—HashMap
  6. [UE4] 动画蓝图的 Beginplay 事件不激活的解决办法:换用 Initialize 事件
  7. You must install libks to build mod_signalwire
  8. es统计有多少个分组_ElasticSearch 分组查询的几个例子
  9. KISSsoft release 03.2014+诚善首饰零售管理
  10. OFDM插入导频过程详解
  11. python控制本地音乐播放器_如何使用python控制音乐播放器
  12. 利用 SysRq 键排除和诊断系统故障
  13. java.lang.exceptionininitializererror_解决出现 java.lang.ExceptionInInitializerError错误问题
  14. Service Mesh 框架选型对比分析:Linkerd、Envoy、Istio、Conduit
  15. 小程序也能接广告了,微信小程序广告位投放指南!
  16. 华硕天选2和华硕天选3哪个好 华硕天选2和华硕天选3区别
  17. ue4树叶飘落动画_Android:使用属性动画制作器的类似于树叶的动画
  18. 数据结构:求两个有序列表的交集,并集
  19. 通达信千元主图公式源码
  20. 全球及中国润滑油市场调查及投资发展规模预测报告2022-2028年版

热门文章

  1. java小票_Java编程打印购物小票实现代码
  2. HTTP head 详解
  3. 用SwiftGen管理UIImage等的String-based接口
  4. kali下sqliv:SQL注入URL扫描器
  5. 实战Jquery(一)--username校验
  6. spring源码分析,聊聊PropertyPlaceholderConfigurer
  7. Android事件处理之多点触摸与手势识别
  8. 转一个网络软件开发的广告
  9. 百度 android geocoding,百度地图经纬度批量查找功能XGeocoding使用手册(示例代码)
  10. python数据分析实战案例-Python数据分析案例实战