博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tarjan进阶
阅读量:6537 次
发布时间:2019-06-24

本文共 1944 字,大约阅读时间需要 6 分钟。

一、边双连通分量

定义

若一个无向图中的去掉任意一条边都不会改变此图的连通性,即不存在桥,则称作边双连通图。一个无向图中的每一个极大边双连通子图称作此无向图的边双连通分量。

实际求法和强连通分量差不多,只是要注意由于一条无向边被分为两条有向边存储,所以在经过其中一条从u到达v之后不能再通过另一条边由v返回u。

代码

inline void tarjan(int x,int fa){      dfn[x]=low[x]=++cnt;      a.push(x);      ist[x]=1;      int wh=0;      for(int i=0;i

二、割点

定义

在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多,就称这个点集为割点集合。

也就是说对于一条边的两个节点u和v,如果low[v]>=dfn[u]则u是一个割点(dfn[u]<dfn[v])。

代码

inline void tarjan(long long x,long long fa){      dfn[x]=low[x]=++cnt;      long long son=0;      for(long long i=0;i
=dfn[x])is[x]=1; }else low[x]=min(low[x],dfn[v[x][i]]); } if(!fa&&son==1)is[x]=0; return;}

三、桥

定义

是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不连通,则称该边为桥。

实际求法和割点差不多,就是要将条件dfn[u]<=low[v]改成dfn[u]<low[v]

代码

inline void tarjan(int x,int fa){      int wh=0;      dfn[x]=low[x]=++cnt;      for(int i=0;i

以上是没有重边的情况,如果有则要这样写

代码

inline void tarjan(int x,int id){      dfn[x]=low[x]=++T;      for(int i=head2[x];i;i=nxt2[i])        if((i+1)/2!=(id+1)/2){          if(!dfn[to2[i]]){              tarjan(to2[i],i);              low[x]=min(low[x],low[to2[i]]);              if(low[to2[i]]>dfn[x])is[id2[i]]=1,S++;;          }else low[x]=min(low[x],dfn[to2[i]]);        }      return;}

 

四、点双连通分量

定义

任意两个点之间存在至少两条点不重复路径。

实际上求点双是基于求割点的。我们每求到一个割点u便将之前栈里存储的点弹出,一直到v为止,注意要把u划到这个点双中但是不能将其弹出,因为一个割点可能属于多个点双。

代码(借用ttl的)

void tarjan(int x,int fa){    dfn[x]=low[x]=++tarcnt;    st[++tp]=x;    for(int k=g1[x];k;k=e1[k].next)    {        int y=e1[k].to;if (y==fa) continue;        if (dfn[y]==0)        {            tarjan(y,x);            low[x]=min(low[x],low[y]);            if (low[y]>=dfn[x])             {                int t;tot++;                add(x,tot),add(tot,x);                do {t=st[tp--],add(t,tot),add(tot,t);}while(t!=y);            }        }        else low[x]=min(low[x],dfn[y]);    }}

转载于:https://www.cnblogs.com/yzxverygood/p/9525924.html

你可能感兴趣的文章
Summary Day30
查看>>
逆向输出回环数组
查看>>
自己动手,实现“你的名字”滤镜
查看>>
高清摄像头MIPI CSI2接口浅解【转】
查看>>
C# CancellationTokenSource和CancellationToken的实现
查看>>
PCIE BAR空间
查看>>
winform命名规范
查看>>
如何用数学课件制作工具画角平分线
查看>>
Linux chmod命令及权限含义
查看>>
jrtplib编译指南
查看>>
VS2015 中统计整个项目的代码行数
查看>>
Anaconda入门使用指南
查看>>
UWP控件与DataBind
查看>>
bash: php: command not found
查看>>
XVIII Open Cup named after E.V. Pankratiev. Eastern Grand Prix
查看>>
数据恢复软件如何换机使用?
查看>>
《高性能mysql》到手
查看>>
(转)关于如何学好游戏3D引擎编程的一些经验
查看>>
使用Kotlin为你的APP自定义一个统一的标题栏
查看>>
EF各版本增删查改及执行Sql语句
查看>>