news 2026/5/25 11:51:42

Tarjan算法图论全家桶系列--边双联通分量(eDCC)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Tarjan算法图论全家桶系列--边双联通分量(eDCC)

边双联通分量(eDCC)

定义

在无向图G=(V,E)中,如果删除任意一条边后,子图仍然连通,则称这个子图是边连通的。
边双连通分量(Edge Biconnected Component, eDCC):图的极大边连通子图。

重要性质:

边双连通分量内部没有割边(桥)
不同的边双连通分量之间通过割边连接
每个节点属于且只属于一个边双连通分量
边双连通分量可以缩点,形成一棵树(每个分量作为一个节点,割边作为树边)

Tarjan算法求边双连通分量

  1. 算法核心思想
    Tarjan算法基于深度优先搜索(DFS),在求割边算法的基础上稍作扩展。核心思想是:
    首先找出所有的割边
    然后删除割边,剩下的每个连通块就是一个边双连通分量
    但实际实现中,我们可以在一次DFS中同时完成这两个任务
  2. 算法流程
    与求割边类似,但添加了一个栈来存储当前DFS路径上的节点。当发现一个割边时,并不立即弹出节点,而是在DFS回溯时,根据dfn[u]==low[u]条件来识别一个边双连通分量。
// 核心判断条件if(low[u]==dfn[u]){// 发现一个新的边双连通分量++tot;// 分量计数器加1intv=-1;do{v=stk.top();stk.pop();bel[v]=tot;// 标记v属于第tot个分量}while(v!=u);}

模板

说明:void Clear(int _n)初始化,准备输入的图有n个点。void Add(int u,int v),在u,v之间连一条无向边。void Run()运行Tarjan算法求双联通分量。vector<int> Get():获取bel数组,bel[i]i点属于的边双联通分量编号

template<intN>structeDCC{//已考虑了含重边的情况vector<pair<int,int>>adj[N];vector<int>stk;vector<int>bel;vector<pair<int,int>>bridge;intdfn[N],low[N];intclk,eid,tot,n;//时间,边编号,边双数量voidAdd(intu,intv){//u,v之间连一条无向边++eid;adj[u].push_back({v,2*eid});adj[v].push_back({u,2*eid+1});}voiddfs(intu,intuk){dfn[u]=low[u]=++clk;stk.push_back(u);for(auto&[to,k]:adj[u]){if(k==(uk^1))continue;//不能走回父亲的边if(dfn[to]==0){dfs(to,k);low[u]=min(low[u],low[to]);if(low[to]>dfn[u])bridge.push_back({u,to});}elselow[u]=min(low[u],dfn[to]);}if(dfn[u]==low[u]){++tot;intv=-1;do{v=stk.back();stk.pop_back();bel[v]=tot;}while(v!=u);}}voidClear(int_n){//开始Add()之前先Clear()n=_n;for(inti=0;i<=_n+3;++i)adj[i].clear();stk.clear();bridge.clear();bel.assign(n+3,0);tot=eid=clk=0;fill(dfn,dfn+5+_n,0);fill(low,low+5+_n,0);}voidRun(){for(inti=1;i<=n;++i)if(dfn[i]==0)dfs(i,-1);}vector<int>Get(){returnbel;}};constintmaxn=2*1e5+20;eDCC<maxn>T;
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 7:13:11

Linux线程操作全指南

Linux线程概述与操作指南线程与进程对比线程是轻量级进程&#xff0c;属于某个进程&#xff0c;共享进程资源但拥有独立栈区&#xff08;默认8MB&#xff09;。进程资源独立&#xff0c;稳定性更高&#xff1b;线程崩溃可能导致整个进程崩溃。线程创建开销更小&#xff08;仅需…

作者头像 李华
网站建设 2026/5/25 7:51:50

传统VS智能:DBC文件处理效率对比实验

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个DBC文件处理效率对比工具。工具应能&#xff1a;1) 自动生成测试用DBC文件 2) 提供传统手动解析方法 3) 实现AI自动解析方法 4) 记录并对比两种方法的处理时间和准确性。输…

作者头像 李华
网站建设 2026/5/26 7:13:11

LobeChat能否支持生物识别?人脸/声纹/步态特征分析应用

LobeChat能否支持生物识别&#xff1f;人脸/声纹/步态特征分析应用 在智能设备日益渗透日常生活的今天&#xff0c;用户对AI助手的期待早已超越“能聊天”的基础功能。我们希望它认识我、理解我&#xff0c;甚至在我开口之前就知道我想做什么——这种“感知型交互”正成为下一代…

作者头像 李华
网站建设 2026/5/26 7:13:13

Miniconda实现Python多版本灵活切换

Miniconda 实现 Python 多版本灵活切换 在机器学习和科学计算的日常开发中&#xff0c;你是否也曾陷入这样的“环境地狱”&#xff1f;&#x1f631; “这个项目用 PyTorch 1.13&#xff0c;必须 Python 3.9&#xff0c;但我的系统是 3.11。”“同事跑通的代码&#xff0c;我一…

作者头像 李华
网站建设 2026/5/26 6:15:09

场馆预约小程序开发:解锁 “预约经济” 的高效解决方案

在数字化转型加速的背景下&#xff0c;场馆预约需求已渗透体育、办公、教育、文旅等多个领域。传统线下预约模式存在 “信息不透明、操作繁琐、管理低效” 等痛点&#xff0c;而小程序凭借 “轻量化、高触达、易操作” 的优势&#xff0c;成为场馆预约场景的理想载体。本文从核…

作者头像 李华
网站建设 2026/5/26 6:16:01

Product Hunt 每日热榜 | 2025-12-16

1. Unloop 标语&#xff1a;为注意力缺陷多动症&#xff08;ADHD&#xff09;和神经多样性思维者设计的视觉模式映射 介绍&#xff1a;Unloop 是一款可视化的模式映射工具&#xff0c;帮助你识别那些让你感到陷入困境的触发因素、想法、情绪和行为。把这些内容可视化&#xf…

作者头像 李华