【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. Windows 8.1中WinRT的变化(二)——新增功能

    首先我们来看看现有控件中新增的功能: FlipView编程方式切换时支持平滑滚动: 在Windows8中,FlipView在用手触控翻页的时候是有动画效果的,但当我们使用键盘或代码编程翻页时,却没有这 ...

  2. nginx服务器设置path_info模式

    1.find / -name nginx.conf找到nginx配置文件 2. ## The default server#server { listen 80; #填写自己的域名 server_na ...

  3. Qt自己定义事件实现及子线程向主线程传送事件消息

    近期在又一次学习Qt的时候,由于要涉及到子线程与主线程传递消息,所以便琢磨了一下.顺便把有用的记录下来,方便自己以后查询及各位同仁的參考! 特此声明,本篇博文主要讲述有用的,也就是直接说明怎么实现,就 ...

  4. ElasticSearch _xpack角色管理

    权限管理可以通过kibana的Management界面进行,本篇主要介绍的是通过命令进行,角色API使您能够在本机域中添加,删除和检索角色. 要使用此API,您必须至少具有manage_securit ...

  5. [Algorithms] Refactor a Linear Search into a Binary Search with JavaScript

    Binary search is an algorithm that accepts a sorted list and returns a search element from the list. ...

  6. native method与so中function的关联

    在Android中,可以通过JNI的方式来调用和访问用C/C++实现的代码,这些代码以SharedLibrary的方式存在于so中.从Java Code到Native Code的一般使用过程为: 在J ...

  7. 在项目中引用android.support.v7

    在Android开发中,新建的项目可能因为缺少对sopport工程的引用而报错,可以这样解决. 1.项目右键 --> import --> Android --> Existing ...

  8. 如何安装Android SDK Emulator

    1 下载并安装JDK,可以到官方网站寻找自己的对应版本下载 http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u1-downlo ...

  9. 使用SQLite存储数据

    一.SQLiteAndroid 为了让我们能够更加方便地管理数据库, 专门提供了一个SQLiteOpenHelper 帮助类,借助这个类就可以非常简单地对数据库进行创建和升级. 1.SQLiteOpe ...

  10. ionic准备之angular基础——dom操作相关(6)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...