1.强连通分量是什么

强连通分量指的是部分点的集合如果能够互相到达(例如 1→3,3→2,2→1(有向图)这种,132每个点都能互相抵达)

或者说,有一个环,环上点的集合就是一个强连通分量

2.那怎么实现呢?

1.根据这个定义,容易想到的就是枚举每个环,虽然确可以得到环,但是时间复杂度趋近于O(n^3)[复杂度自己算的可能不准确]

2.优化:类似于SPFA,当每个点的入度小于进队次数的时候,跳出,外加一个数组存当前点的来源

3.O(n^2+m)算法 得到每个点的遍历序,然后反向遍历,有交集的部分就是一个强连通分量

4.O(n+m)算法 : tarjan,kosaraju (貌似还有一个算法和tarjan有异曲同工之妙)

前两种应该好写但是没必要写,真的有用的就是tarjan和kos算法,但是kos是跑的两遍bfs,常数比较大,所以学了tarjan

比如这张图,求他的强连通分量个数

    low[u]=++ds;
dfn[u]=low[u];
s.push(u);
int i,j;
ins[u]=;
for(i=head[u];i;i=e[i].next)
{
j=e[i].to;
if(!dfn[j])
{
tarjan(j);
low[u]=min(low[u],low[j]);
}
else if(ins[j]) low[u]=min(low[u],dfn[j]);
}

首先找到一个没有被访问的点(比如1)

然后从1开始遍历,dfn[i]不仅标记了i是否被访问[0或者有值],同时标记这个点被访问的序号(留着日后作对比),右边绿色的是当前栈的情况

low表示从该店遍历能够找到的最小被访问的序号,如果往下没有边的话dfn[i]=low[i]

当现在找到了6这个点不能刷新low,因此不难发现{6}是一个强连通分量

if(dfn[u]==low[u])
{
cnt++;
while(u!=j)
{
j=s.top();
s.pop();
ins[j]=;
bd[j]=cnt;
}
}

于是6退栈,然后发现u==j 即6==6,跳出,然后重复这样做,发现{5}也是个强连通分量

回到3,发现还没找完边,跳到4,发现4与1联通,又可以得到low[1]]=1回溯发现low[3]=1

然后走剩下一条边,同理,发现low[1]=low[2]=low[3]=low[4]

if(dfn[u]==low[u])
{
cnt++;
while(u!=j)
{
j=s.top();
s.pop();
ins[j]=;
bd[j]=cnt;
}
}

于是u!=j一直做下去,的到剩下的强连通分量{1,2,3,4}

对了这道题在我发在洛谷上了:

https://www.luogu.org/problemnew/show/T84034

tarjan 学习记的更多相关文章

  1. 洛谷 P3387 【模板】缩点 DAGdp学习记

    我们以洛谷P3387 [模板]缩点 来学习DAGdp 1.这道题的流程 //伪代码 for i->n if(i未被遍历) tarjan(i) 缩点() DAGdp() 完成 首先tarjan这部 ...

  2. MMM 数位dp学习记

    数位dp学习记 by scmmm 开始日期 2019/7/17 前言 状压dp感觉很好理解(本质接近于爆搜但是又有广搜的感觉),综合了dp的高效性(至少比dfs,bfs优),又能解决普通dp难搞定的问 ...

  3. MMM 状压dp学习记

    状压dp学习记 by scmmm 开始日期 2019/7/17 前言 状压dp感觉很好理解(本质接近于爆搜但是又有广搜的感觉),综合了dp的高效性(至少比dfs,bfs优),又能解决普通dp难搞定的问 ...

  4. ftk学习记(icon篇)

    [声明:版权全部,欢迎转载.请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在開始今天的文章之前.我们还是先看一下上一节的效果图. 大家能够參照上一节的解说,是不是存在这种 ...

  5. ftk学习记(消息框篇)

    [ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 上一篇说到了输入框.闲话不多说,首先看结果显示, 大家看看效果是不是和我们之前说的一样.今天, ...

  6. 菜鸟VUER学习记——零0章、打开新的大门

    是什么 基于MVVM模型,核心库只关注视图层,通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件的js框架.根据项目的复杂度和需求,渐进的加入插件以达到恰到好处的程度. 解决问题 UI组件化 ...

  7. [Tarjan 学习笔记](无向图)

    今天考试因为不会敲 Dcc 的板子导致没有AK(还不是你太菜了),所以特地写一篇博客记录 Tarjan 的各种算法 无向图的割点与桥 (各种定义跳过) 割边判定法则 无向边 (x,y) 是桥,当且仅当 ...

  8. Tarjan学习笔记

    \(Tarjan\)是个很神奇的算法. 给一张有向图,将其分解成强连通分量们. 强连通分量的定义:一个点集,使得里面的点两两可以互相到达,并且再加上另一个点都无法满足强连通性. \(Tarjan\)的 ...

  9. ftk学习记(label篇)【转】

    转自:http://blog.csdn.net/feixiaoxing/article/details/25000093 版权声明:本文为博主原创文章,未经博主允许不得转载. [ 声明:版权所有,欢迎 ...

随机推荐

  1. wamp无法进入phpMyAdmin或localhost的解决方法

    我用的是最新版的wampsever5,在win7(64位)下安装正常使用,没有无法进入phpMyAdmin的问题,但是我在虚拟机安装了win8(64位专业版),测试在win8下面的使用情况时,就有问题 ...

  2. PHP在不同页面间传递Json数据示例代码

    gettest.php文件: <?php $value["name"]= urlencode("我的姓名"); $value["pass&quo ...

  3. Java并发——ThreadPoolExecutor线程池解析及Executor创建线程常见四种方式

    前言: 在刚学Java并发的时候基本上第一个demo都会写new Thread来创建线程.但是随着学的深入之后发现基本上都是使用线程池来直接获取线程.那么为什么会有这样的情况发生呢? new Thre ...

  4. C# 递归读取XML菜单数据

    在博客园注册了有4年了,很遗憾至今仍未发表过博客,趁周末有空发表第一篇博客.小生不才,在此献丑了! 最近在研究一些关于C#的一些技术,纵观之前的开发项目的经验,做系统时显示系统菜单的功能总是喜欢把数据 ...

  5. Unity c# 状态机的简单入门

    状态机模式在unity中作用是非常大的,可以实现角色的移动和场景的跳转,包括一些动画的播放,在很多unity框架中也是很常见的,发散思维广阔,下面是简单的状态机的实现,有注释 using System ...

  6. droplang - 删除一种 PostgreSQL 过程语言

    SYNOPSIS droplang [ connection-option...] langname [ dbname] droplang [ connection-option...] --list ...

  7. dialog - 从 shell 显示对话框

    总览 (SYNOPSIS) dialog --clear dialog --create-rc file dialog --print-maxsize dialog common-options bo ...

  8. MySQL存储过程实现分页及变量的定义

    delimiter是MySQL中的命令,这个命令与存储过程没什么关系. 其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了. 即改变输入结束符. 默认情况下,delimit ...

  9. iview table icon dorpdown html页面级别vue组件 #vuez#

    iview table icon dorpdown html页面级别vue组件 <!DOCTYPE html> <html> <head> <meta cha ...

  10. Vickers Vane Pump Tips - Vane Pump Maintenance Note

    The    Vickers Vane Pump    describes the matters needing attention in the maintenance of the vane p ...