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 ...
随机推荐
- python接入百度智能云API实现ai对话
python接入百度智能云API实现ai对话 千帆大模型平台-百度智能云千帆 代码段: import requests import json # 获取访问令牌的函数 def get_access_t ...
- 记一次golang项目context引发的OOM故障
之前写过一篇一种基于etcd实践节点自动故障转移的思路, 程序经历过一次线上进程内存持续上涨终OOOM的小事故, 本次技术复盘导致本次内存泄露的完整起因. 提炼代码: 业务函数etcdWatchLoo ...
- 八米云-N1、机顶盒设置静态地址和PPPOE拨号流程
疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 这里以老毛子路由系统举例: 一.设置静态地址 1.路 ...
- SpringBoot - [00] 注解大全
原文链接:https://mp.weixin.qq.com/s/DgNhohtJyEq4vMGEzqrP8A @SpringBootApplication 这个注解用于标识一个SpringBoot应用 ...
- 【自荐】Catime v1.0.4 一款贼好用的计时器
Github: https://github.com/vladelaina/Catime 仅1.3MB!!!!! 特点 极简设计: 透明界面.点击穿透.可调大小和位置.多语言支持 丰富字体: 47种字 ...
- 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
大家好!今天给大家带来一个好消息,Dapr(Distributed Application Runtime)1.15版本正式发布啦!对于不熟悉Dapr的朋友来说,Dapr是一个开源的.跨平台的运行时, ...
- 数据库离程序员有多远 - cnblogs救园行动感想
这两周,我参与了博客园的"2024救园行动",成了终身会员.说实话,当初报名的时候,我心里还挺兴奋的,想着这下能和不少老朋友在这个社区里再次相聚.毕竟,在数据库行业摸爬滚打了这么多 ...
- 基于Microsoft.Extensions.AI核心库实现RAG应用
大家好,我是Edison. 之前我们了解 Microsoft.Extensions.AI 和 Microsoft.Extensions.VectorData 两个重要的AI应用核心库.基于对他们的了解 ...
- asp.net core配置项示例代码
1.IConfigurationSource:表示一个配置源,其Build方法生成的IConfigurationProvider用于从当前配置源中读取key-value值(TryGey读取.Set设置 ...
- Web前端入门第 12 问:HTML 常用属性一览
HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. HTML 常用属性大约 70 个,是否又头大了?脸上笑嘻嘻,心里嘛...嘿嘿... 温馨提示:属性不用死记硬背, ...