tarjan进阶
一、边双连通分量
定义
若一个无向图中的去掉任意一条边都不会改变此图的连通性,即不存在桥,则称作边双连通图。一个无向图中的每一个极大边双连通子图称作此无向图的边双连通分量。
实际求法和强连通分量差不多,只是要注意由于一条无向边被分为两条有向边存储,所以在经过其中一条从u到达v之后不能再通过另一条边由v返回u。
代码
inline void tarjan(int x,int fa){
      dfn[x]=low[x]=++cnt;
      a.push(x);
      ist[x]=;
      int wh=;
      for(int i=;i<v[x].size();i++){
            if(v[x][i]==fa&&!wh){
              wh=;
              continue;
            }
          if(!dfn[v[x][i]]){
            tarjan(v[x][i],x);
            low[x]=min(low[x],low[v[x][i]]);
          }else if(ist[v[x][i]]){
            low[x]=min(low[x],dfn[v[x][i]]);
          }
        }
      if(dfn[x]==low[x]){
          sum++;
          while(){
            int u=a.top();
            a.pop();
            ist[u]=;
            belong[u]=sum;
            if(u==x)break;
          }
      }
      return;
}
二、割点
定义
在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多,就称这个点集为割点集合。
也就是说对于一条边的两个节点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=;
      for(long long i=;i<v[x].size();i++)
        if(v[x][i]!=fa){
          if(!dfn[v[x][i]]){
            son++;
            tarjan(v[x][i],x);
            low[x]=min(low[x],low[v[x][i]]);
            if(low[v[x][i]]>=dfn[x])is[x]=;
          }else low[x]=min(low[x],dfn[v[x][i]]);
        }
      if(!fa&&son==)is[x]=;
      return;
}
三、桥
定义
是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不连通,则称该边为桥。
实际求法和割点差不多,就是要将条件dfn[u]<=low[v]改成dfn[u]<low[v]
代码
inline void tarjan(int x,int fa){
      int wh=;
      dfn[x]=low[x]=++cnt;
      for(int i=;i<v[x].size();i++)
        if(v[x][i]!=fa){
          if(!dfn[v[x][i]]){
              tarjan(v[x][i],x);
              low[x]=min(low[x],low[v[x][i]]);
              if(dfn[x]<low[v[x][i]])ans++;
          }else low[x]=min(low[x],dfn[v[x][i]]);
        }
      return;
}
以上是没有重边的情况,如果有则要这样写
代码
inline void tarjan(int x,int id){
      dfn[x]=low[x]=++T;
      for(int i=head2[x];i;i=nxt2[i])
        if((i+)/!=(id+)/){
          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]]=,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]==)
{
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]);
}
}
tarjan进阶的更多相关文章
- [心得]暑假DAY 5
		好久没更新博客了 最近事情太多太多 tarjan进阶,点双边双 T2压力 最大坑点:点双缩点 它不是直接把割点连成树(割点会有环) 而是用割点作”中介“,联接点双构成一颗树(所谓圆方树) 接着在上面进 ... 
- 强连通分量算法·$tarjan$初探
		嗯,今天好不容易把鸽了好久的缩点给弄完了--感觉好像--很简单? 算法的目的,其实就是在有向图上,把一个强连通分量缩成一个点--然后我们再对此搞搞事情,\(over\) 哦对,时间复杂度很显然是\(\ ... 
- 【强联通图 | 强联通分量】HDU 1269 迷宫城堡 【Kosaraju或Tarjan算法】
		为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明 ... 
- [Tarjan系列] Tarjan算法与有向图的SCC
		前面的文章介绍了如何用Tarjan算法计算无向图中的e-DCC和v-DCC以及如何缩点. 本篇文章资料参考:李煜东<算法竞赛进阶指南> 这一篇我们讲如何用Tarjan算法求有向图的SCC( ... 
- 无向图求割点(找桥)tarjan
		本博客参考了李煜东的<算法竞赛进阶指南>,大家要是觉得这篇文章写的不错请大家支持正版.豆瓣图书 我在之前的博客中讲解了搜索序时间戳,这次我们讲讲追溯值的概念. 追溯值: 设subtree( ... 
- 无向图求割(找桥)tarjan
		本博客参考了李煜东的<算法竞赛进阶指南>,大家要是觉得这篇文章写的不错请大家支持正版.豆瓣图书 我在之前的博客中讲解了搜索序时间戳,这次我们讲讲追溯值的概念. 追溯值: 设subtree( ... 
- 总结-一本通提高篇&算竞进阶记录
		当一个人看见星空,就再无法忍受黑暗 为了点亮渐渐沉寂的星空 不想就这样退役 一定不会鸽の坑 . 一本通提高篇 . 算竞进阶 . CDQ & 整体二分 . 平衡树 . LCT . 字符串 . 随 ... 
- nodejs进阶(6)—连接MySQL数据库
		1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ... 
- nodejs进阶(4)—读取图片到页面
		我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ... 
随机推荐
- linux monitor and maintanence
			@cacti 1.install epel extends source 2.install lamp use yum method yum install -y httpd php php-mysq ... 
- 2018.7.2 AK22 不良品分析
			a 电路 b 软件 STM32-工业炉温控制器程序 c . layout 不良分析: 1测各模块电压 12V ok 5V ok 3.3V ok 2跟换MCU 给MCU烧程序 ok 3测量MCU晶 ... 
- Django基于form组件实现注册校验
			一 基本流程 1 创建form组件对应的类,比如LoginForm 2 前端的三种渲染方式: 渲染方式三种: 1 <form action="" novalidate met ... 
- CodeForces - 682E: Alyona and Triangles(旋转卡壳求最大三角形)
			You are given n points with integer coordinates on the plane. Points are given in a way such that th ... 
- QT:QString、QByteArray和char *的转换 【转载】
			原文网址:http://blog.csdn.net/light1028/article/details/7899541 第一种,数据流的方式,这里只说从QByteArray转向QString. QBy ... 
- Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)
			本文主要内容: 信号量的实现 利用信号量解决哲学家用餐问题 利用信号量解决生产者消费者问题 一.信号量的实现 1.1 信号量结构 typedef struct { int value; struct ... 
- WPF中ToolTip的自定义
			ToolTip或者PopUp这个控件在做界面时会经常用到.如何对ToolTip进行自定义呢? 1.首先自定义tooltip的controlTemplate,完全清除系统默认效果, 如下: ... 
- 在CentOS上安装Java开发环境:使用yum安装jdk
			请参考百度经验:http://jingyan.baidu.com/article/4853e1e51d0c101909f72607.html 如果您阅读过此文章有所收获,请为我顶一个,如果文章中有错误 ... 
- rem怎么计算
			px:相对长度单位.像素px是相对于显示器屏幕分辨率而言的 em:相对单位,继承父节点(层层继承,传递)基准点为父节点字体的大小,如果自身定义了font-size按自身来计算(浏览器默认字体是16px ... 
- web页面导出到Excel乱码解决
			引言: 前几天 在做web项目的时候 需要导出页面上的数据 到Excel里面 但有的时候出现乱码(有de时候不出现 很奇怪) 原来的代码是这样的: HttpContext.Current.Respon ... 
