Processing math: 100%

[学习笔记]tarjan

强连通分量

时间复杂度:O(n+m)
用途:有向图缩环

int f[N],dfn[N],low[N],sta[N],top;
/*dfn[u]:遍历到u点的时间; low[u]:u点可到达的各点中最小的dfn[v],即最高层的点*/
bool ins[N];
inline void tarjan(int u){
dfn[u]=low[u]=++cnt;
sta[++top]=u;ins[u]=true;
for(int i=g[u];i;i=e[i].nxt)
if(!dfn[e[i].to]){
tarjan(e[i].to);
low[u]=min(low[u],low[e[i].to]);
}
else if(ins[e[i].to])
low[u]=min(low[u],low[e[i].to]);
if(dfn[u]==low[u]){
while(sta[top+1]!=u){
f[sta[top]]=u;
ins[sta[top--]]=false;
}
}
}
inline void solve(){
for(int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
}

割边

割边,又称桥.

dfn[],low[]的定义同tarjan求有向图强连通分量.

枚举当前点u的所有邻接点v:

1.如果某个邻接点v未被访问过,则访问v,并在回溯后更新low[u]=min(low[u],low[v]);

2.如果某个邻接点v已被访问过,则更新low[u]=min(low[u],dfn[v]).

对于当前节点u,如果邻接点中存在一点v满足low[v]>dfn[u](v向上无法到达uu祖先)说明(u,v)为一条割边.

inline void tarjan(int u,int fa){
dfn[u]=low[u]=++cnt;
for(int i=g[u];i;i=e[i].nxt)
if(!dfn[e[i].to]){
tarjan(e[i].to,u);
low[u]=min(low[u],low[e[i].to]);
if(low[e[i].to]>dfn[u]) cut[e[i].n]=true;
}
else if(e[i].to!=fa)
low[u]=min(low[u],dfn[e[i].to]);
}

割点

dfn[],low[]的定义同tarjan求有向图强连通分量.

枚举当前点u的所有邻接点v:

1.如果某个邻接点v未被访问过,则访问v,并在回溯后更新low[u]=min(low[u],low[v]);

2.如果某个邻接点v已被访问过,则更新low[u]=min(low[u],dfn[v]).

对于当前节点u,

如果u为搜索树中的根节点,若它的子节点数2(根是多棵子树上节点的唯一连通方式),则u为割点;

如果u为搜索树上的非根节点,若存在子节点v满足low[v]dfn[u](v向上无法到达u的祖先),则u为割点.

inline void tarjan(int u,int fa){
dfn[u]=low[u]=++cnt;
for(int i=g[u];i;i=e[i].nxt){
++t[u];
if(!dfn[e[i].to]){
tarjan(e[i].to,u);
low[u]=min(low[u],low[e[i].to]);
if(u==rt){
if(t[u]>=2) cut[u]=true;
}
else if(low[e[i].to]>=dfn[u])
cut[u]=true;
}
else if(e[i].to!=fa)
low[u]=min(low[u],dfn[e[i].to]);
}
}

2017-01-26 19:18:26

posted @   Aireen_Ye  阅读(57)  评论(0编辑  收藏  举报
编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· 《HelloGitHub》第 106 期
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用
底部 顶部 留言板 归档 标签
Der Erfolg kommt nicht zu dir, du musst auf den Erfolg zugehen.



点击右上角即可分享
微信分享提示