news 2026/10/3 21:55:05

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[])传入总点数n,vector<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/10/2 23:22:30

Day 42 复习日

浙大疏锦行 信贷风险预测代码&#xff0c;考虑神经网络&#xff0c;借助AI改进 # 1. 导入核心库 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import time import warnings warnings.filterwarnings("ignore"…

作者头像 李华
网站建设 2026/10/4 1:58:47

大模型Memory模块深度解析:从基础实现到高级应用!

简介 文章详细介绍了大模型Memory模块的设计意义与实现方法&#xff0c;包括不借助LangChain的基础记忆实现、自定义Memory模块开发流程、spacy实体识别的高级应用&#xff0c;以及LangChain中七种内置Memory模块的对比分析。文章还提供了从初阶应用到模型训练的完整学习路径&…

作者头像 李华
网站建设 2026/10/4 2:44:33

53.自定义工作队列传参

这里用到了container_of&#xff0c;可以利用某个成员的地址&#xff0c;顺藤摸瓜拿到拿到整个结构体的地址驱动#include <linux/module.h> #include <linux/init.h> #include <linux/interrupt.h> #include <linux/gpio.h> #include <linux/delay.…

作者头像 李华
网站建设 2026/10/4 9:45:13

安全VR:靠谱的VR安全体验馆厂商品牌榜,技术实力与落地案例

安全VR&#xff1a;靠谱的VR安全体验馆厂商品牌榜&#xff0c;技术实力与落地案例开篇总起在安全培训领域&#xff0c;数字化转型需求迫切&#xff0c;传统培训方式效果欠佳。安全VR体验馆凭借高度还原场景、沉浸式体验等优势&#xff0c;成为提升安全培训效果的有效手段。但市…

作者头像 李华
网站建设 2026/10/4 8:01:37

灵遁者:我对于探索的热爱,从来没有减少过

我对于探索的热爱&#xff0c;从来没有减少过。探索生命&#xff0c;这是自人类诞生以来&#xff0c;一直在拼命解读的课题。所以关于生命&#xff0c;我们思考得再多&#xff0c;也远远不够。 灵遁者&#xff0c;赞3这是一个需要创新的时代&#xff0c;但更是一个需要“消化”…

作者头像 李华
网站建设 2026/10/3 21:09:08

右值引用和移动语义

作用&#xff1a;C11中引用了右值引用和移动语义&#xff0c;可以避免无谓的复制&#xff0c;提高了程序性能。 1. 什么是左值、右值 可以从2个角度判断&#xff1a; 左值可以取地址、位于等号左边&#xff1b; 而右值没法取地址&#xff0c;位于等号右边。 int a 6; a可…

作者头像 李华