tarjan(强连通分量、边双、点双)
强连通分量
注意到一个强连通分量中 dfn 序最小的点一定有 \(dfn_u=low_u\)。因此条件成立时就将自己和栈上方的点全部压入一个强连通分量中。
而如果枚举的 \(v\) 有 \(dfn\) 序,但其 \(vis\) 已经不为 1 了,也就是说 \(v\) 已经不在栈里面了,那其已经被弹出栈了,就不用管它了。
void tar(int u){
low[u]=dfn[u]=++dfncnt;vis[u]=1,stk[++top]=u;
for(int i=0;i<tot[u];i++){
int v=q[u][i];
if(!dfn[v]){
tar(v);low[u]=min(low[u],low[v]);
}
else if(vis[v]) low[u]=min(dfn[v],low[u]);
}
if(dfn[u]==low[u]){
++blockcnt;
do{scc[blockcnt].push_back(stk[top]);vis[stk[top]]=0;}while(stk[top--]!=u);
}
}
边双
可以发现求边双与求强连通分量是本质相同的。只是边双由于是无向图需要考虑反边。
void tar(int u,int fa){
low[u]=dfn[u]=++dfncnt;vis[u]=1,stk[++top]=u;
for(int i=0;i<tot[u];i++){
int v=q[u][i];if(v==fa) continue;
if(!dfn[v]){
tar(v,u);low[u]=min(low[u],low[v]);
}
else if(vis[v]) low[u]=min(dfn[v],low[u]);
}
if(dfn[u]==low[u]){
++blockcnt;
do{scc[blockcnt].push_back(stk[top]);vis[stk[top]]=0;}while(stk[top--]!=u);
}
}
点双
求点双需要注意根节点的问题。还有因为某一个点很有可能是多个点双间的割点,因此需要在循环里判定,同时注意不要把割点给弹出栈。
void tar(int u){
low[u]=dfn[u]=++dfncnt;stk[++top]=u;int tmp=0;
if(u==rt&&tot[u]==0){scc[++blockcnt].push_back(u);return;}
for(int i=0;i<tot[u];i++){
int v=q[u][i];
if(!dfn[v]){
tar(v);low[u]=min(low[u],low[v]);
if(low[v]==dfn[u]){
if(++tmp==1&&u==rt) continue;
blockcnt++;
do{scc[blockcnt].push_back(stk[top--])}while(stk[top+1]!=v);scc[blockcnt].push_back(u);
}
}
else low[u]=min(low[u],dfn[v]);
}
}
tarjan(强连通分量、边双、点双)的更多相关文章
- Tarjan 强连通分量 及 双联通分量(求割点,割边)
Tarjan 强连通分量 及 双联通分量(求割点,割边) 众所周知,Tarjan的三大算法分别为 (1) 有向图的强联通分量 (2) 无向图的双联通分量(求割点,桥) ...
- tarjan 强连通分量
一.强连通分量定义 有向图强连通分量在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly c ...
- tarjan强连通分量模板(pascal)
友好城市 [问题描述]小 w 生活在美丽的 Z 国. Z 国是一个有 n 个城市的大国, 城市之间有 m 条单向公路(连接城市 i. j 的公路只能从 i 连到 j). 城市 i. j 是友好城市当且 ...
- 1051: [HAOI2006]受欢迎的牛 (tarjan强连通分量+缩点)
题目大意:CodeVs2822的简单版本 传送门 $Tarjan$强连通分量+缩点,若连通块的个数等于一则输出n:若缩点后图中出度为0的点个数为1,输出对应连通块内的点数:否则输出0: 代码中注释部分 ...
- [poj 2553]The Bottom of a Graph[Tarjan强连通分量]
题意: 求出度为0的强连通分量. 思路: 缩点 具体有两种实现: 1.遍历所有边, 边的两端点不在同一强连通分量的话, 将出发点所在强连通分量出度+1. #include <cstdio> ...
- [poj 1904]King's Quest[Tarjan强连通分量]
题意:(当时没看懂...) N个王子和N个女孩, 每个王子喜欢若干女孩. 给出每个王子喜欢的女孩编号, 再给出一种王子和女孩的完美匹配. 求每个王子分别可以和那些女孩结婚可以满足最终每个王子都能找到一 ...
- 算法模板——Tarjan强连通分量
功能:输入一个N个点,M条单向边的有向图,求出此图全部的强连通分量 原理:tarjan算法(百度百科传送门),大致思想是时间戳与最近可追溯点 这个玩意不仅仅是求强连通分量那么简单,而且对于一个有环的有 ...
- Equivalent Sets HDU - 3836 2011多校I tarjan强连通分量
题意: 给一些集合 要求证明所有集合是相同的 证明方法是,如果$A∈B$,$B∈A$那么$A=B$成立 每一次证明可以得出一个$X∈Y$ 现在已经证明一些$A∈B$成立 求,最少再证明多少次,就可以完 ...
- Codeforces Round #244 (Div. 2) C. Checkposts (tarjan 强连通分量)
题目:http://codeforces.com/problemset/problem/427/C 题意:给你n座城市,m条有向道路,然后有一个机制,你在某一个城市设置检查点,那么被设置的检查点受保护 ...
- bzoj1051: [HAOI2006]受欢迎的牛(tarjan强连通分量)
强连通缩下点,出度为0有多个答案为0,否则答案为出度为0的强连通分量中点的个数. 发现一道tarjan模板题,顺便复习一波tarjan #include<iostream> #includ ...
随机推荐
- 从 14 秒到 1 秒:MySQL DDL 性能优化实战
1. 问题背景 MySQL版本:8.0.30 测试表数据量:200万 在 MySQL 中,研发人员最初执行了以下 SQL 语句,向表 t_email 中添加了一个允许为 NULL 的列 id3,并设置 ...
- C# 手机号码隐藏中间四位
C# 隐藏手机号码中间四位数字 使用正则表达式隐藏手机号中间四位 if (!string.IsNullOrWhiteSpace(txtPhone.Text) && txtPhone.T ...
- Java - 高射炮打蚊子(第二弹)
题记部分 01 || 面试题 001 || 什么是JVM JVM(Java虚拟机)是Java程序运行的环境,它是一个抽象的计算机,包括指令集.寄存器集.堆栈.垃圾回收等.JVM屏蔽了与具体操作系统平台 ...
- docker - [11] 数据卷之DockerFile
通过DockerFile可以生成一个镜像 一.DockerFile的介绍 狂神:dockerfile是用来构建docker镜像的文件命令参数脚本. 狂神:dockerfile是面向开发的,我们以后要发 ...
- Flink学习(十七) Emitting to Side Outputs(侧输出)
我们在生产实践中经常会遇到这样的场景,需把输入源按照需要进行拆分,比如我期望把订单流按照金额大小进行拆分,或者把用户访问日志按照访问者的地理位置进行拆分等.面对这样的需求该如何操作呢? 大部分的Dat ...
- Flink学习(二) 应用场景和架构模型
实时计算最好的时代 在过去的十年里,面向数据时代的实时计算技术接踵而至.从我们最初认识的 Storm,再到 Spark 的异军突起,迅速占领了整个实时计算领域.直到 2019 年 1 月底,阿里巴巴内 ...
- DeepSeek在M芯片Mac上本地化部署
在 Mac 上使用 Ollama 运行 DeepSeek-R1,并通过 Open-WebUI 提供 Web 端访问. 1. 安装 Ollama Ollama官方:https://ollama.com/ ...
- pandas如何处理跳过表头操作
1.打印前5行数据,发现存在'NAN' 2.如果这个问题不处理,后续要到操作列时,会报错误''DataFrame' object is not callable' 思路: 跳过有NAN的行 def t ...
- DB读写分离情况下,如何解决缓存和数据库不一致性问题?
前言 在读写分离的情况下,缓存和数据库数据不一致怎么解决? 请看这一篇如何更新缓存保证缓存和数据库双写一致性? 如何解决DB数据库的数据不一致问题? 请看这一篇怎么解决DB读写分离,导致数据不一致问题 ...
- laravel-echo-server 启动报错 [ioredis] Unhandled error event: ReplyError: NOAUTH Authentication required.
可以在 .env 文件加上以下配置 LARAVEL_ECHO_SERVER_REDIS_HOST= LARAVEL_ECHO_SERVER_REDIS_PASSWORD= LARAVEL_ECHO_S ...