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 ...
随机推荐
- TensorFlow函数 tf.argmax()
参数: input:输入数据 dimension:按某维度查找. dimension=0:按列查找: dimension=1:按行查找: 返回: 最大值的下标 import tensorflow.co ...
- [BZOJ3451] Normal 题解
这题分三步:葺网(期望).淀粉质(点分治).蓉翅(容斥),再佐以芬芳团(FFT),一道巨难无比的 luogu 黑题就诞生了. 期望 先考虑在淀粉树上,\(i\) 点在 \(j\) 点的子树里的概率.实 ...
- 软件工程: SDLC V模型
V型 V-model 代表一个开发过程,可以被认为是瀑布模型的扩展,是更通用的 V-model 的一个例子.不是以线性方式向下移动,而是在编码阶段之后向上弯曲工艺步骤,以形成典型的 V 形.V 模型展 ...
- 用 solon-ai 写个简单的 deepseek 程序(构建全国产 ai 智能体应用)
用国产应用开发框架(及生态),对接国产 ai.构建全国产 ai 智能体应用. 1.先要申请个 apiKey 打开 https://www.deepseek.com 官网,申请个 apiKey .(一万 ...
- 『玩转Streamlit』--缓存机制
Streamlit 应用在运行时,每次用户交互都会触发整个脚本的重新执行. 这意味着一些耗时操作,如数据加载.复杂计算和模型训练等,可能会被重复执行,严重影响应用响应速度. 本文介绍的缓存机制能够帮助 ...
- .NET10 - 预览版1新功能体验(一)
.NET 10 首个预览版已经在前两天发布,该版本在 .NET Runtime.SDK.libraries.C#.ASP.NET Core.Blazor 和 .NET MAUI 等多个方面都有重大改进 ...
- VMware15.5虚拟机下载及安装
一.VMware虚拟机介绍 VMWare虚拟机软件是一个"虚拟PC"软件,它使你可以在一台机器上同时运行二个或更多Windows.DOS.LINUX系统.与"多启动&qu ...
- 互联网寒冬下,如何写好一份.NET求职简历?附带简洁免费的简历模板!!!
前言 在当今互联网行业的寒冬时期,每一位求职者都面临着更为激烈的竞争环境,如何在众多.NET候选人中脱颖而出,成为企业心仪的对象,用心准备一份简历显得尤为重要.简历不仅是个人职业经历的简要概述,更是向 ...
- 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
前言 今天大姚给大家分享 3 个 .NET 开源.免费的文件压缩处理库,希望可以快速帮助同学们实现文件压缩和解压功能! SharpCompress SharpCompress 是一个基于 C# 编写的 ...
- 我觉得 AI 你过分了!
大家好,我是程序员鱼皮.创业之后,头发掉的厉害,已经记不清自己头发茂密如林的时候了... 正好最近 AI 工具 Gemini 新出了原生多模态生图功能,于是便想借助 AI 来生成一张 "鱼皮 ...