tarjan求强联通分量

变量含义说明:

pre[i]:i点的被访问的时钟编号,被分配后保持不变
low[i]:i点能访问的最先的点的时钟编号,随子节点改变
scc_no[i]:i点所在的强联通分量的编号
dfs_clock:时钟序号,每访问一个新的点时都增长1
scc_cnt:强联通分量的编号
栈stk:每访问一个节点都压入栈中

他的步骤如下所述:

  1. 从根节点开始访问
  2. 为此新点的pre和low赋值现在的时间
  3. 遍历访问它的子节点
    如果此点未被访问,则跳回第二步,然后跟新其low值
    如果已访问但其未进入强联通编号,则用此点pre更新父节点的low值
  4. 遍历完子节点后,如果发现此点的low值和pre值相等,则说明它是所在强联通分量的拥有最小时间访问编号的那个点,于是可以从栈stk中弹出他的后续所有节点,并为他们赋值一个新的强联通分量的编号。

具体代码如下;

@Frosero

#include <iostream>
#include <cstring>
#include <stack>
#include <vector> int low[202],pre[202],scc_no[202],dfs_clock,scc_cnt;
vector<int>mps[202];
stack<int>stk; void tarjan(int s){
pre[s] = low[s] = ++dfs_clock;
stk.push(s);
for(int i=0;i<mps[s].size();i++){
int v = mps[s][i];
if(!pre[v]){
tarjan(v);
low[s] = min(low[s],low[v]);
}
else if(!sccno[v]){
low[s] = min(low[s],pre[v]);
}
} if(pre[s] == low[s]){
scc_cnt++;
while(true){
int x = stk.top(); stk.pop();
sccno[x] = scc_cnt;
if(x == s) break;
}
}
} void fin_circle(int s){
memset(pre,0,sizeof(pre);
dfs_clock = scc_cnt = 0;
tarjan(s);
}

tarjan求强联通分量的更多相关文章

  1. Tarjan求强联通分量+缩点

    提到Tarjan算法就不得不提一提Tarjan这位老人家 Robert Tarjan,计算机科学家,以LCA.强连通分量等算法闻名.他拥有丰富的商业工作经验,1985年开始任教于普林斯顿大学.Tarj ...

  2. USACO06JAN The Cow Prom /// tarjan求强联通分量 oj24219

    题目大意: n个点 m条边的图 求大小大于1的强联通分量的个数 https://www.cnblogs.com/stxy-ferryman/p/7779347.html tarjan求完强联通分量并染 ...

  3. tarjan求强联通分量 模板

    void tarjan(int u) { dfn[u]=low[u]=++dfs_clock; stack_push(u); for (int c=head[u];c;c=nxt[c]) { int ...

  4. Tarjan的强联通分量

    求强联通分量有很多种. <C++信息学奥赛一本通>  中讲过一个dfs求强联通分量的算法Kosdaraju,为了骗字数我就待会简单的说说.然而我们这篇文章的主体是Tarjan,所以我肯定说 ...

  5. tarjan模板 强联通分量+割点+割边

    // https://www.cnblogs.com/stxy-ferryman/p/7779347.html ; struct EDGE { int to, nt; }e[N*N]; int hea ...

  6. Tarjan算法---强联通分量

    1.基础知识 在有向图G,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子 ...

  7. tarjan求双联通分量(割点,割边)

    之前一直对tarjan算法的这几种不同应用比较混淆...我太弱啦! 被BLO暴虐滚过来 用tarjan求点双,很多神犇都给出了比较详细的解释和证明,在这里就不讲了(其实是这只蒟蒻根本不会orz) 这里 ...

  8. 强大的dfs(用处1——拓扑排序【xdoj1025】,用处二——求强联通分量【ccf高速公路】)当然dfs用处多着咧

    xdoj 1025 亮亮最近在玩一款叫做“梦想庄园”的经营游戏.在游戏中,你可以耕种,养羊甚至建造纺织厂. 如果你需要制造衣服,你首先得有布匹和毛线.布匹由棉花纺织而成:毛线由羊毛制成,而羊需要饲料才 ...

  9. Tarjan 算法求强联通分量

    转载自:http://blog.csdn.net/xinghongduo/article/details/6195337 还是没懂Tarjan算法的原理.但是感觉.讲的很有道理. 说到以Tarjan命 ...

随机推荐

  1. vue-cli创建的项目中引入第三方库报错'caller', 'calle', and 'arguments' properties may not be...

    本文链接:https://blog.csdn.net/Sophie_U/article/details/76223978 问题: 在vue的main.js中引入mui.min.js时,报错. 如上,单 ...

  2. 【Flutter学习】基本组件之进度条(LinearProgressIndicator, CircularProgressIndicator)

    一,概述 基本有两种类型: 条形进度条(LinearProgressIndicator) new LinearProgressIndicator( backgroundColor: Colors.bl ...

  3. [CSP-S模拟测试]:抽卡(概率DP)

    题目描述 水上由岐最近在肝手游,游戏里有一个氪金抽卡的活动.有$n$种卡,每种卡有 3 种颜色.每次抽卡可能什么也抽不到,也可能抽到一张卡.每氪金一次可以连抽 m 次卡,其中前$m−1$次抽到第$i$ ...

  4. python random模块随机取list中的某个值

    import random from random import randint ''' random.randint()随机生一个整数int类型,可以指定这个整数的范围,同样有上限和下限值,pyth ...

  5. 用 Flask 来写个轻博客 (17) — MV(C)_应用蓝图来重构项目

    目录 目录 前文列表 重构目录结构 重构代码 使用蓝图后的路由过程 总结 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hello World ...

  6. 搭建RAID10(5块硬盘)过程并模拟其中一块硬盘损坏

    首先:RAID 10,实际是将RAID 0和RAID 1标准结合的产物,在连续地以位或字节为单位分割数据并且并行读/写多个磁盘的同时,为每一块磁盘作磁盘镜像进行冗余.它的优点是同时拥有RAID 0的超 ...

  7. Java输入/输出教程

    Java输入/输出(I/O)处理从源读取数据并将数据写入目标.通常,读取存储在文件中的数据或使用I/O将数据写入到文件中. java.io和java.nio包中包含处理输入/输出的Java类.java ...

  8. 防止重复提交 aspx.net

    :服务器控制.后台生成一个token,存入session或者其他缓存里面.渲染表单时,给form一个隐藏的token(令牌).用户提交表单时:先判断表单里面的token是否存在,不存在拒绝接受此数据: ...

  9. SpringBoot集成Thymeleaf模板

    1.添加起步依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  10. axios interceptors 拦截 , 页面跳转, token 验证 Vue+axios实现登陆拦截,axios封装(报错,鉴权,跳转,拦截,提示)

    Vue+axios实现登陆拦截,axios封装(报错,鉴权,跳转,拦截,提示) :https://blog.csdn.net/H1069495874/article/details/80057107 ...