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. 每天一个linux命令:nl(12)

    nl nl命令读取 file 参数(缺省情况下标准输入),计算输入中的行号,将计算过的行号写入标准输出.在输出中,nl命令根据您在命令行中指定的标志来计算左边的行.输入文本必须写在逻辑页中.每个逻辑页 ...

  2. 存储过程中的in out in out 三种类型的参数

    in 是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变. out模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程 in out 表示高参数可以 ...

  3. 集合类中的Collection接口实现类

    今天学习一下集合包里面的内容,常见的有Collection和Map两个接口的实现类Collection中常见的又分为两种: 1.List ,支持放入重复的对象,实现类有arraylist,linked ...

  4. System.IO.Path 文件名、路径、扩展名处理

    string filePath =@"E:/Randy0528/中文目录/JustTest.rar"; 更改路径字符串的扩展名.System.IO.Path.ChangeExten ...

  5. eclispse指针变成十字型

    按ATL+Shift+A可以十字和箭头切换.

  6. java 重新学习 (一)

    一 垃圾回收特点 1.垃圾回收的工作目标是回收物对象的内存空间,这些内存空间都是jvm堆内存里的空间,垃圾回收器值回收内存资源,对他的物理资源:数据库连接,磁盘I/O等资源则无能为力 2.更快进行垃圾 ...

  7. JDK,JRE,JVM

    jdk JDK是整个Java的核心,包括了Java运行环境(Java Runtime Environment),一堆Java工具和Java基础的类库(rt.jar).不论什么Java应用服务器,实质都 ...

  8. emacs-w3m查看html帮助手册

    emacs-w3m查看html帮助手册 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #83949 ...

  9. 关于pandas

    axis轴,axis=0为逐行,axis=1为逐列

  10. tushare积分怎么获得 tushare pro 积分充值 积分转让

    本人是做量化投资的,团队转型,换了交易策略,手头有多个离职同事的闲置转让.600分:原价50元,仅需39元1500分:原价150元,仅需109元(售罄)2000分:原价200元,仅需149元5000分 ...