1. 单向边  + 新图建边

int belong[N], dfn[N], low[N], now_time, scc_cnt;
stack<int> s;
void dfs(int u){
dfn[u] = low[u] = ++now_time;
s.push(u);
for(int i = head[u]; ~i; i = nt[i]){
if(!dfn[to[i]]) dfs(to[i]);
if(!belong[to[i]]) low[u] = min(low[u], low[to[i]]);
}
if(dfn[u] == low[u]){
++scc_cnt;
int now;
while(){
now = s.top(); s.pop();
belong[now] = scc_cnt;
if(now == u) break;
}
}
}
void scc(int n){
now_time = scc_cnt = ;
for(int i = ; i <= n; ++i)
if(!belong[i]) dfs(i);
int v;
for(int i = ; i <= n; ++i){
for(int j = head[i]; ~j; j=nt[j]){
v = to[j];
if(belong[v] != belong[i]){
vc[belong[i]].pb(belong[v]);
}
}
}
}

2.双向边 + 新图建边

int belong[N], dfn[N], low[N], now_time, scc_cnt;
vector<int> vc[N];
vector<pll> e[N];
stack<int> s;
void dfs(int u, int id){
dfn[u] = low[u] = ++now_time;
s.push(u);
for(int i = head[u]; ~i; i = nt[i]){
if(i == (id^)) continue;
if(!dfn[to[i]]) dfs(to[i], i);
if(!belong[to[i]]) low[u] = min(low[u], low[to[i]]);
}
if(dfn[u] == low[u]){
++scc_cnt;
int now;
while(){
now = s.top(); s.pop();
belong[now] = scc_cnt;
if(now == u) break;
}
}
}
void scc(int n){
for(int i = ; i <= n; ++i) dfn[i] = low[i] = belong[i] = ;
while(!s.empty()) s.pop();
now_time = scc_cnt = ;
for(int i = ; i <= n; ++i)
if(!belong[i]) dfs(i, -);
for(int i = , u, v; i < tot; i += ){
u = to[i], v = to[i+];
u = belong[u], v = belong[v];
if(u != v) e[u].pb(pll(v,i/+)), e[v].pb(pll(u,i/+));
}
}

3.边双连通分量。

  边双连通就是没有一个桥。

  桥的定义就是断开这个边能使得图分为2部分。

  先找到桥, 然后再dfs不经过桥所能到达的点都是同一个边双联通分量。  

int dfn[N], low[N], dtot;
void Tarjan(int o, int u){
dfn[u]= low[u] = ++dtot;
for(int i = head[u]; ~i; i = nt[i]){
int v = to[i];
if(!dfn[v]){
Tarjan(u, v);
low[u] = min(low[u], low[v]);
if(low[v] > dfn[u])
bridge[i] = bridge[i^] = ;
}
else if(v != o)
low[u] = min(low[u], dfn[v]);
}
}
int c[N], dcc;
void dfs(int u){
c[u] = dcc;
for(int i = head[u]; i; i = nt[i]){
int v = to[i];
if(c[v] || bridge[i]) continue;
dfs(v);
}
}
int ok[N];
vector<pll> vc[N];
void e_dcc(){
for(int i = ; i <= n; ++i)
if(!dfn[i]) Tarjan(, i);
for(int i = ; i <= n; ++i)
if(!c[i]) {
++dcc;
dfs(i);
}
for(int i = ; i <= tot; i += ){
int u = to[i^], v = to[i];
u = c[u], v = c[v];
if(u == v){
ok[u] |= val[i];
}
else {
vc[u].pb({v,val[i]});
vc[v].pb({u,val[i]});
}
}
}

模板汇总——Tarjian的更多相关文章

  1. 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板

    一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...

  2. 【模板】NOIP模板汇总

    图论 数据结构 数学 其他: 洛谷模板:a,b两个字符串,求b串在a串中出现的位置 #include<iostream> #include<cstdio> #include&l ...

  3. 模板汇总——KMP & EX-KMP

    1. kmp 相当于往前求出一段字符信息,使得 这段字符信息和前缀相等. void getnext(){ , j = ; nx[] = -; while(j < m){ || b[j] == b ...

  4. 模板汇总——AC自动机

    AC自动机 模板题 HDU-2222 Keywords Search #include<bits/stdc++.h> using namespace std; #define LL lon ...

  5. python实现AES/DES/RSA/MD5/SM2/SM4/3DES加密算法模板汇总

    都是作者累积的,且看其珍惜,大家可以尽量可以保存一下,如果转载请写好出处https://www.cnblogs.com/pythonywy 一.md5加密 1.简介 这是一种使用非常广泛的加密方式,不 ...

  6. 【模板】Tarjian求LCA

    概念 公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点 举个例子吧,如下图所示4和5的最近公共祖先是2,5和3的最近公共祖先是1,2和1的最近公共祖先是1. 算法 常用的求LCA的算法有:Ta ...

  7. 【POJ各种模板汇总】(写在逆风省选前)(不断更新中)

    1.POJ1258 水水的prim……不过poj上硬是没过,wikioi上的原题却过了 #include<cstring> #include<algorithm> #inclu ...

  8. 模板汇总——treap

    1. 旋转treap. 思想:一颗权值BST + 一颗 随机数 最小堆. BZOJ - 3224 代码: #include<bits/stdc++.h> using namespace s ...

  9. 模板汇总——splay

    #define lch(x) tr[x].son[0] #define rch(x) tr[x].son[1] ; , root; struct Node{ ], pre, sz; void init ...

随机推荐

  1. Rust写时复制Cow<T>

    写时复制(Copy on Write)技术是一种程序中的优化策略,多应用于读多写少的场景.主要思想是创建对象的时候不立即进行复制,而是先引用(借用)原有对象进行大量的读操作,只有进行到少量的写操作的时 ...

  2. vue前后分离项目部署(不同端口号,nginx反向代理解决跨域问题)

    #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...

  3. Java内部类超详细总结(含代码示例)

    什么是内部类 什么是内部类? 顾名思义,就是将一个类的定义放在另一个类的内部. 概念很清楚,感觉很简单,其实关键在于这个内部类放置的位置,可以是一个类的作用域范围.一个方法的或是一个代码块的作用域范围 ...

  4. [Short-Circuit Constraint Violation]警告解决办法

    今天用Altium Designer16画PCB时候遇到一个问题,进行DRC检测,警告如下: [Short-Circuit Constraint Violation] GrayscaleSensor1 ...

  5. kubernetes API服务器的安全防护

    12.1.了解认证机制 启动API服务器时,通过命令行选项可以开启认证插件. 12.1.1.用户和组 了解用户: 分为两种连接到api服务器的客户端: 1.真实的人 2.pod,使用一种称为Servi ...

  6. iview自定义实现多级表头

    最近更新: 2018-07-19 注意:最新版iview已经提供多级表头功能 参考 原理:利用多个Table组件通过显示和隐藏thead和tbody来拼接表格(较粗暴) html <div st ...

  7. 【KakaJSON手册】02_JSON转Model_02_数据类型

    由于JSON格式的能表达的数据类型是比较有限的,所以服务器返回的JSON数据有时无法自动转换成客户端想要的数据类型. 比如服务器返回的时间可能是个毫秒数1565480696,但客户端想要的是Date类 ...

  8. Oracle delete和truncate实践操作之一

    实践说明 本文章主要记录在Oracle中,delete和truncate进行数据删除之后,如何进行数据恢复.由于网上对delete和truncate的区别说明较多,此处不过多介绍两者区别. 注:由于环 ...

  9. django 获取当前访问的URL

    next_url = request.path_info print(next_url) print(request.get_full_path()) //打印出全路径(路径和参数) print(re ...

  10. 写论文的第四天 Spark安装 使用sparkshell

    Spark分布式安装 Spark安装注意:需要和本机的hadoop版本对应 前往spark选择自己相对应的版本下载之后进行解压 命令:tar –zxf spark-2.4.0-bin-hadoop2. ...