news 2026/7/11 17:32:43

Tarjan算法图论全家桶--点双联通分量

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Tarjan算法图论全家桶--点双联通分量

定义

在无向图G=(V,E)中,如果删除任意一个节点(及其关联的边)后,子图仍然连通,则称这个子图是点连通的。

点双连通分量(Vertex Biconnected Component, vDCC):图的极大点连通子图

重要性质

  1. 点双连通分量内部没有割点
  2. 不同的点双连通分量之间通过割点连接
  3. 一个割点可以属于多个点双连通分量
  4. 点双连通分量和割点一起可以构成块-割点树

Tarjan算法求点双连通分量

1. 算法核心思想

Tarjan算法基于深度优先搜索(DFS),是求割点算法的扩展。核心思想是:

  1. 在DFS过程中维护一个,存储当前搜索路径上的节点
  2. 当发现一个割点时,从栈中弹出节点直到当前节点的子节点
  3. 弹出的节点与割点一起构成一个点双连通分量
  4. 注意:割点不出栈,因为它可能属于多个分量

2. 算法流程

// 核心判断条件if(low[to]>=dfn[u]){// 发现割点u的一个vDCC++tot;// 新增一个点双连通分量intv;do{v=stk.top();stk.pop();Dcc[tot].push_back(v);}while(v!=to);// 弹出直到子节点toDcc[tot].push_back(u);// 割点u也加入分量}

模板

说明:void Run(int _n,vector<int> adj[])传入总点数nvector<int>[]邻接表adj,运行Tarjan求点双联通分量。vector<int> Dcc[N]Dcc[i]存了编号为i的vDcc内所有的点.

template<intN>structvDCC{intdfn[N],low[N];constvector<int>*adj;vector<int>stk,cut;vector<int>Dcc[N];//1~tot,Dcc[i],编号为i的vDcc内的点.inttot;//vDcc数量intn,clk,root;voiddfs(intu){dfn[u]=low[u]=++clk;stk.push_back(u);intcnt=0;for(intto:adj[u]){if(dfn[to]==0){dfs(to);low[u]=min(low[u],low[to]);if(low[to]>=dfn[u]){++cnt;++tot;intv;do{v=stk.back();stk.pop_back();Dcc[tot].emplace_back(v);}while(v!=to);Dcc[tot].emplace_back(u);}}elselow[u]=min(low[u],dfn[to]);}if((u!=root&&cnt>=1)||cnt>=2)cut[u]=true;if(cnt==0&&u==root)Dcc[++tot].pb(u);}voidRun(int_n,vector<int>adj[]){n=_n;this->adj=adj;clk=tot=0;fill(dfn,dfn+n+3,0);fill(low,low+n+3,0);stk.clear();cut.assign(n+3,false);for(inti=0;i<=n+3;++i)Dcc[i].clear();for(inti=1;i<=n;++i){if(dfn[i]==0){root=i;dfs(i);}}}};constintmaxn=2*1e5+20;vDCC<maxn>T;
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/11 6:03:49

双十二投影仪哪款值得推荐?这4个价位段最值得买的一款

双十二大促是2025年入手投影仪最后的黄金窗口期。面对琳琅满目的产品&#xff0c;如何根据自身需求和预算快速锁定最佳选择&#xff1f;本文直接从预算与场景入手&#xff0c;为大家带来覆盖全价位段的四款高性价比投影仪&#xff0c;从便携入门到专业影院级&#xff0c;一步到…

作者头像 李华
网站建设 2026/7/7 3:21:33

常用接口抓包以及接口测试工具总结

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 接口统称为API&#xff0c;程序与程序之间的对接、交接。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点&#xff0c;主要是为了检验不…

作者头像 李华
网站建设 2026/7/10 20:38:10

练题100天——DAY29:岛屿的周长+寻找两个正序数组的中位数

今天的两道题都是有点硬的骨头&#xff0c;勉勉强强能做出来&#xff0c;但是想不到特定的解决方法&#xff0c;算法难度★★★★。深度优先算法和二分查找以为自己会&#xff0c;遇到这两道题算是给了我当头两棒&#xff1a;根本不知道何时用、怎么用深度优先算法&#xff0c;…

作者头像 李华
网站建设 2026/7/10 15:22:51

EtherCAT 转 Modbus RTU 网关:实现倍福 PLC 与宇电 AI-516 温控器协同联动

一、项目背景 某精密机械制造企业的数控加工生产线面临异构设备通信难题&#xff1a;生产线核心控制采用倍福 CX5140 PLC&#xff08;支持 EtherCAT 协议&#xff09;&#xff0c;负责主轴运转、工序联动及整体流程控制&#xff0c;而现场 18 台数控加工机床的温度调控依赖宇电…

作者头像 李华
网站建设 2026/7/11 14:21:45

平台生态:生成式AI的差异化规则与适配策略

主流AI平台的生态特征不同生成式AI平台基于其训练数据、技术架构和商业策略&#xff0c;形成了各具特色的“生态偏好”。理解这些差异是制定有效GEO策略的前提。OpenAI的ChatGPT表现出对权威来源和近期内容的明显偏好。研究显示&#xff0c;ChatGPT在回答事实性问题时&#xff…

作者头像 李华