tarjan 强连通分量 缩点
关于 强连通分量 缩点 tarjan是什么 自行搜索,这里只是封了一个板子
Codeforces Round #490 (Div. 3) E题
题目一眼可得tarjan 也不是一次两次了 封了板子,最开始还想做个模板类,但仔细一想,时间复杂度导致点个数不会超int,所以如果点序号大于int先离散化再做
板子如下
1 | /* construct: vertexsize |
基本上 使用分3个步骤就好
根据size初始化
给它加单向边
.addpath(from,to)
准备一个结果数组a,调用
.work(a)
得到的结果数组
a[原来的点序号]=缩点后的点序号
emmm 需要加两个宏使用
#define rep(i,a,n) for (int i=a;i<n;i++)
和#define pb push_back
增强复用+简化
1 |
|
简述操作
tarjan(u)
- 深搜: 标记序号, 到达最小, u进栈
- 子点v未访问(dfn[v] == 0), 递归tarjan(v), low[u] = min(low[u],low[v])
- 子点v在栈中(result[v] == 0), low[u] = min(low[u],深搜序号[v])
- 当low[u] == dfn[u]时, 逐个出栈直到遇到u, 这些出栈的都是属于u这个联通分量 result[i] = u