【0】README

0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 “DFS应用——查找强分支” 的idea 并用源代码加以实现 ;


【1】查找强分支

1.1)如何检测一个图是否是强连通的: 通过执行两次DFS, 我们可以检测一个有向图是否是强连通的, 如果它不是强连通的,那么我们实际上可以得到顶点的一个子集, 它们到其自身是强连通的;

1.2)首先, 在输入的图G上执行一次 DFS。 通过对深度优先生成森林的后序遍历将G的顶点编号, 然后再把G 的所有边反向,形成 Gr(如何构建 Gr)



1.3)上述算法通过对 Gr 执行一次深度优先搜索而完成, 总是在编号最高的顶点开始一次新的DFS。于是,我们在顶点G 开始对 Gr 的DFS, G的编号为10。

1.4)但该顶点不通向任何顶点, 因此下一次搜索在H 点开始(以下查找强分支的过程仅仅是一个可能的case,仅举例而已)。 这次调用访问 I 和 J。 下一次调用在B点开始并访问 A、C 和 F。 此后的调用时 DFS(D)以及最终调用DFS(E)。



1.5)结果得到的深度优先生成森林如下图所示:



1.6)对深度优先生成森林中的分析:

在该深度优先生成森林中的每棵树形成一个强连通分支。 对于我们的例子, 这些强连通分支为 {G}, {H,I,J}, {B,A,C,F},{D} 和 {E};

1.7)为了理解上述算法为什么成立?

  • 1.7.1)首先,注意到, 如果两个顶点v 和 w 都在同一个强连通分支中,那么在原图G中就存在从 v到w 和从w到v的路径,因此, 在Gr中也存在。
  • 1.7.2)现在,如果两个顶点v 和 w 不在Gr的同一个深度优先生成树中,那么显然它们也不可能在同一个强连通分支中;

【2】source code + printing results

2.1)download source code: https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter9/p249_dfs_strong_component

2.2)source code at a glance:(for complete code , please click the given link above)

// finding the strong component from the reverse graph and strongComponent derives from dfs
void strongComponent(Vertex vertex, int depth)
{
int i;
AdjTable temp;
Vertex adjVertex; //printf("\n\t visited[%c] = 1 ", flag[vertex]);
visited[vertex] = 1; // update visited status of vertex
vertexIndex[vertex] = counter++; // number the vertex with counter
temp = reverseAdj[vertex]; while(temp->next)
{
printf(" ");
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 effect
for(i = 0; i < depth; i++)
printf(" ");
printf("v[%c]->v[%c] (backside) \n", flag[vertex], flag[adjVertex]);
}
} else
{
parent[adjVertex] = vertex; // just for printing effect
for(i = 0; i < depth; i++)
printf(" ");
printf("v[%c]->v[%c] (building edge)\n", flag[vertex], flag[adjVertex]);
strongComponent(adjVertex, depth+1);
}
temp = temp->next;
}
}

2.3)printing results:



DFS应用——查找强分支的更多相关文章

  1. 搜索(DFS)---查找最大连通面积

    查找最大的连通面积 695. Max Area of Island (Medium) [[0,0,1,0,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0] ...

  2. Java实现DFS深度优先查找

    1 问题描述 深度优先查找(depth-first search,DFS)可以从任意顶点开始访问图的顶点,然后把该顶点标记为已访问.在每次迭代的时候,该算法紧接着处理与当前顶点邻接的未访问顶点.这个过 ...

  3. 对无向图的深度优先搜索(DFS)

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

  4. HDU 4272 LianLianKan (状压DP+DFS)题解

    思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...

  5. 【bzoj4817】树点涂色 LCT+线段树+dfs序

    Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...

  6. 【427】Graph 实现 以及 DFS & BFS

    目录: Graph 实现 二维数组实现 Linked List 实现 DFS:深度优先搜索 stack 实现 recursion 实现 BFS:广度优先搜索(queue) 其他应用 非连通图遍历 - ...

  7. poj1011(DFS+剪枝)

    题目链接:https://vjudge.net/problem/POJ-1011 题意:给定n(<=64)条木棍的长度(<=50),将这些木棍刚好拼成长度一样的若干条木棍,求拼出的可能的最 ...

  8. Cleaning Robot (bfs+dfs)

    Cleaning Robot (bfs+dfs) Here, we want to solve path planning for a mobile robot cleaning a rectangu ...

  9. 树的最长链-POJ 1985 树的直径(最长链)+牛客小白月赛6-桃花

    求树直径的方法在此转载一下大佬们的分析: 可以随便选择一个点开始进行bfs或者dfs,从而找到离该点最远的那个点(可以证明,离树上任意一点最远的点一定是树的某条直径的两端点之一:树的直径:树上的最长简 ...

随机推荐

  1. mysql的三大范式

    关系数据库的几种设计范式介绍: 第一范式:确保每列的原子性(强调的是列的原子性,即列不能够再分成其他几列). 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式 ...

  2. win10 下常用shell命令

    shell脚本命令 单行过长如何换行 在一行的结尾加上^即可 , 打印当前目录 %cd%

  3. #define,#undef宏学习

    1.预处理器 1.1预处理符号: __FILE__ :进行编译的源文件名字 __LINE__ :文件当前行的行号 __DATA__ :文件被编译的日期 __TIME__ :文件被编译的时间 __STD ...

  4. Makefile之“=”、":="、“+=”、“?=”

    Makefile之“=”.":=".“+=”.“?=”中几个的区别: 1.”=“符号 =表示个变量赋值: 注意: 当变量A被赋值给变量B时(B=A),这里A可以的这条指令之前定义的 ...

  5. C#中 protected internal 和 internal 的区别

    http://kudick.blog.163.com/blog/static/1666066320091055414453/ DoDo: protected: 爷爷有一张银行卡,爸爸可以用,儿子也可以 ...

  6. 自己动手写android图片异步载入库

    尊重他人劳动成果,转载请说明出处:http://blog.csdn.net/bingospunky/article/details/44344085 接触android有半年了.关于图片异步载入.一直 ...

  7. dev_queue_xmit()函数返回值问题

    函数  dev_queue_xmit()用于直接使用sk_buf发包,此函数有返回值,但是并不能通过 此函数返回值为0来说明包已经发送出去且可以立刻释放sk_buff内存.因为网卡发包是一个异步的过程 ...

  8. C++ 设置控制台输出颜色

    #include <stdint.h> #include <iostream> #include <string> #include <Windows.h&g ...

  9. 创建你的第一个ionic+cordova应用(1)

    前面我们安装了前端的神器webstorm11,体验到了强大的开发体验,接着我们来安装ionic 必备: Node.js (npm安装工具) 百度下载 官网下载  注:如果官网新版不能安装请用百度下载0 ...

  10. POJ 2029 Get Many Persimmon Trees (二维树状数组)

    Get Many Persimmon Trees Time Limit:1000MS    Memory Limit:30000KB    64bit IO Format:%I64d & %I ...