今天,我们要探讨的就是——Tarjan算法。

Tarjan算法的主要作用便是求一张无向图中的强连通分量,并且用它缩点,把原本一个杂乱无章的有向图转化为一张DAG(有向无环图),以便解决之后的问题。

首先,我们在原图上跑一遍DFS,然后会发现三种边:

1、正常边:嗯,顾名思义就是连接祖先和儿子节点的边。

2、横叉边:连接到了已经弹出的节点的边(也能叫它小三边)。

3、返祖边:从儿子节点连到祖先的边。

那么通过进一步的观察我们可以发现:返祖边可能产生强连通分量,而横叉边不能。(如下图所示)

DFS遍历之后即为:

这时,我们发现上图出现了一种“大圈包小圈”的情况({1-5-6-8-9}和{5-6-8-5})那么我们应该如何处理才能做到当出现上图情况时只计算最大的那个强连通分量呢?

我们可以开两个数组:

dfn[i]:记录当遍历到节点i时是第几次dfs。

low[i]:记录以i为根的子树中能够连接到当前栈中最小的dfn值(也就是最上面的节点)。

然后每次取最小的low[i]就可以了。

Emmmmmmmmmmm,那就上代码吧。(Pascal党的福利哦)

var
vis:array[1..100000]of boolean;
stack,dfn,low,head,next,vet,blong,belong:array[1..100000]of longint;
tot,time,top,x,y,i,n,m,point:longint;
function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end;
procedure add(x,y:longint);
begin
inc(tot);
next[tot]:=head[x];
vet[tot]:=y;
head[x]:=tot;
end;
procedure tarjan(u:longint);
var
i,v:longint;
begin
inc(time);
dfn[u]:=time; low[u]:=time;
inc(top);
stack[top]:=u; vis[u]:=true;
i:=head[u];
while i<>0 do
begin
v:=vet[i];
if vis[v] then low[u]:=min(dfn[v],low[u])
else if dfn[v]=0 then
begin
tarjan(v);
low[u]:=min(low[v],low[u]);
end;
i:=next[i];
end;
if dfn[u]=low[u] then
begin
inc(point); belong[u]:=point;
while stack[top]<>u do
begin
belong[stack[top]]:=point;
vis[stack[top]]:=false;
dec(top);
end;
vis[u]:=false; dec(top)
end;
end;
procedure shrink_point;
var
u,i,v:longint;
begin
for u:=1 to n do
begin
i:=head[u];
while i<>0 do
begin
v:=vet[i];
if belong[i]<>belong[v] then add(belong[u],belong[v]);
i:=next[i];
end;
end;
end;
begin
read(n,m);
point:=n;
for i:=1 to m do
begin
read(x,y);
add(x,y);
end;
for i:=1 to n do
if dfn[i]=0 then tarjan(i);
shrink_point;
end.

[学习笔记] Tarjan算法求强连通分量的更多相关文章

  1. HDU 1269 迷宫城堡 tarjan算法求强连通分量

    基础模板题,应用tarjan算法求有向图的强连通分量,tarjan在此处的实现方法为:使用栈储存已经访问过的点,当访问的点离开dfs的时候,判断这个点的low值是否等于它的出生日期dfn值,如果相等, ...

  2. Tarjan 算法求 LCA / Tarjan 算法求强连通分量

    [时光蒸汽喵带你做专题]最近公共祖先 LCA (Lowest Common Ancestors)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili tarjan LCA - YouTube Tarj ...

  3. [学习笔记] Tarjan算法求桥和割点

    在之前的博客中我们已经介绍了如何用Tarjan算法求有向图中的强连通分量,而今天我们要谈的Tarjan求桥.割点,也是和上篇有博客有类似之处的. 关于桥和割点: 桥:在一个有向图中,如果删去一条边,而 ...

  4. 【算法】Tarjan算法求强连通分量

    概念: 在有向图G中,如果两个定点u可以到达v,并且v也可以到达u,那么我们称这两个定点强连通. 如果有向图G的任意两个顶点都是强连通的,那么我们称G是一个强连通图. 一个有向图中的最大强连通子图,称 ...

  5. tarjan算法求强连通分量

    先上代码: #include <iostream> #include <cstring> #include <vector> #include <stack& ...

  6. tarjan 算法求强连通分量

    #include<bits/stdc++.h> #define ll long long using namespace std; const int P=1e6; ; ; const i ...

  7. Tarjan算法分解强连通分量(附详细参考文章)

    Tarjan算法分解强连通分量 算法思路: 算法通过dfs遍历整个连通分量,并在遍历过程中给每个点打上两个记号:一个是时间戳,即首次访问到节点i的时刻,另一个是节点u的某一个祖先被访问的最早时刻. 时 ...

  8. kosaraju算法求强连通分量

    什么是强连通分量?在这之前先定义一个强连通性(strong connectivity)的概念:有向图中,如果一个顶点s到t有一条路径,t到s也有一条路径,即s与t互相可达,那么我们说s与t是强连通的. ...

  9. Tarjan模板——求强连通分量

    Tarjan求强连通分量的流程在这个博客讲的很清楚,再加上我也没理解透,这里就不写了. 缩点:将同一个连通块内的点视为同一个点. 扔一道模板题:codeVS2822爱在心中 第一问很显然就是求点数大于 ...

随机推荐

  1. 深入了解Netty【八】TCP拆包、粘包和解决方案

    1.TCP协议传输过程 TCP协议是面向流的协议,是流式的,没有业务上的分段,只会根据当前套接字缓冲区的情况进行拆包或者粘包: 发送端的字节流都会先传入缓冲区,再通过网络传入到接收端的缓冲区中,最终由 ...

  2. 非IT行业大企程序员讲述MIS系统开发案例

      雪莉叹了一口气,调整了一下被汗水濡湿的刘海,然后向后靠在办公椅中,伸手在电脑键盘上输入了一些内容, 最后拿起印刷着房地产广告的扇子,边扇风边等待着.   她的工位在办公室的东侧角落,侧靠着窗.此时 ...

  3. Centos7安装后进不去,死活就要填licence,该怎么办?

    遇到这个问题不要麻爪,跟着我做: 1 回车 2 回车 c 回车 c 回车 然后就进入系统了. 要使它联网,点右上角的开关按钮,将PCI Ethernet选择为connect状态. 我的centos7是 ...

  4. leetcode刷题-47全排列2

    题目 给定一个可包含重复数字的序列,返回所有不重复的全排列. 思路 其思路与46题完全一致,但是需要与组合总和2题一般,在同一层取出重复元素.因此可以在每一层设置一个set()类型,将访问过的元素放入 ...

  5. Java模拟实现扫雷功能

    //棋子 public class Chess { private boolean isBoomb=false; private int id;//下标 //点击方法 public int click ...

  6. xss构造--如何使用xss语句

    XSS的构造 1.利用[<>]构造html/js 如[<script>alert(/xss/)</script>] 2.伪协议 使用javascript:伪协议来构 ...

  7. shell变量操作${}详细用法

    ${}基本功能 一般情况下$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围 [root@localhost ~]# A=Linux [root@localhost ~] ...

  8. 【开发总结】order by 为什么没有走索引?

    1.  现象 表结构如下 CREATE TABLE `ACT_HI_INST` ( `ID` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '主键', ` ...

  9. Hadoop演进与Hadoop生态

    1.了解对比Hadoop不同版本的特性,可以用图表的形式呈现. (1)0.20.0~0.20.2: Hadoop的0.20分支非常稳定,虽然看起来有些落后,但是经过生产环境考验,是 Hadoop历史上 ...

  10. 6.Exchanger-交换机