当前位置: 首页 > news >正文

tarjan进阶

一、边双连通分量

定义

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

实际求法和强连通分量差不多,只是要注意由于一条无向边被分为两条有向边存储,所以在经过其中一条从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<v[x].size();i++){
            if(v[x][i]==fa&&!wh){
              wh=1;
              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(1){
            int u=a.top();
            a.pop();
            ist[u]=0;
            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=0;
      for(long long i=0;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]=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<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+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

相关文章:

  • ubuntu13启动屏幕亮度0解决方法
  • 数据结构与抽象 Java语言描述 第4版 pdf (内含标签)
  • 文件尾存在EOF吗?
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • JMeter中的读取json数据---JSON Extractor插件
  • 添加GDataXMLNODE.h和.m的方法
  • Administrator 被禁用
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 工作地址
  • Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案
  • 2014年第一天
  • zabbix3.4 修改监控范围
  • poj1006_Biorhythms
  • JAVA自学笔记13
  • nginx根据访问的url参数或者是请求 头部做判断转发
  • SegmentFault for Android 3.0 发布
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • ComponentOne 2017 V2版本正式发布
  • Create React App 使用
  • JavaScript异步流程控制的前世今生
  • Java的Interrupt与线程中断
  • JAVA之继承和多态
  • JS字符串转数字方法总结
  • ReactNative开发常用的三方模块
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 阿里云前端周刊 - 第 26 期
  • 闭包--闭包之tab栏切换(四)
  • 初探 Vue 生命周期和钩子函数
  • 动态魔术使用DBMS_SQL
  • 仿天猫超市收藏抛物线动画工具库
  • 给新手的新浪微博 SDK 集成教程【一】
  • 后端_MYSQL
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 使用parted解决大于2T的磁盘分区
  • 用jQuery怎么做到前后端分离
  • - 转 Ext2.0 form使用实例
  • Python 之网络式编程
  • 从如何停掉 Promise 链说起
  • 正则表达式-基础知识Review
  • ​​​​​​​​​​​​​​Γ函数
  • ​水经微图Web1.5.0版即将上线
  • "无招胜有招"nbsp;史上最全的互…
  • #define、const、typedef的差别
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1)STL算法之遍历容器
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转) RFS+AutoItLibrary测试web对话框
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .Net 6.0 处理跨域的方式
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?