引入

tarjan算法有两个最重要东西
dfn[x]表示x的dfs序
low[x]表示x以及x能连到的点中(包括间接连到的)最小的dfn
还有两个标记
一个表示是否访问过
一个为是否在当前的栈中

求解

low何时能更新呢
设当前点为v,子节点为u
1、u没有访问过
那么先递归进去然后low[v]=min(low[u])
2、u访问过但在当前的栈中
这说明u为v的祖先,那么只能low[v]=min(dfn[u])

另外

除了强联通分量以外,tarjan还可以求桥边,割点等
求割点:任意一个 low[u]>=dfn[v] low[u]>=dfn[v]

Code

这个代码是单向图中,所以判断简单一点
如果在双向图中,需要复杂一点的判断

void tarjan(int x)
{low[x]=dfn[x]=++tot;p[++p[0]]=x;bz[x]=bz2[x]=1;for(int i=last[x];i;i=next[i]){int y=to[i];if(!bz[y]){tarjan(y);low[x]=min(low[x],low[y]);}else if(bz2[y]) low[x]=min(low[x],dfn[y]);}if(low[x]==dfn[x]){totot++;for(;p[p[0]+1]!=x;p[0]--){int k=p[p[0]];c[k]=totot;bz2[k]=0;}}
}

然而有些题目的图是一条链的,会爆栈

人工栈版Tarjan

为了方便(复制)起见,这里调用tarjan(x)和上面递归的调用tarjan(x),效果是完全一样的
c是染色数组

void tarjan1()
{int x=zx[o];low[x]=dfn[x]=++tot;p[++p[0]]=x;bz[x]=bz2[x]=1;for(int i=last[x];i;i=next[i]){if(!bz[to[i]]){zk[o]=1;zi[o]=i;zx[++o]=to[i];zk[o]=0;return;} else if(bz2[to[i]]) low[x]=min(low[x],dfn[to[i]]);}if(low[x]==dfn[x]){totot++;for(;p[p[0]+1]!=x;p[0]--) c[p[p[0]]]=totot,bz2[p[p[0]]]=0;}o--;
}
void tarjan2()
{int x=zx[o];low[x]=min(low[x],low[to[zi[o]]]);for(int i=next[zi[o]];i;i=next[i]){if(!bz[to[i]]){zk[o]=1;zi[o]=i;zx[++o]=to[i];zk[o]=0;return;} else if(bz2[to[i]]) low[x]=min(low[x],dfn[to[i]]);}if(low[x]==dfn[x]){totot++;for(;p[p[0]+1]!=x;p[0]--) c[p[p[0]]]=totot,bz2[p[p[0]]]=0;}o--;
}
void tarjan(int x)
{zx[++o]=x;zk[o]=0;zi[o]=0;while(o>0){if(zk[o]==0) tarjan1(); else tarjan2();}
}

例题

【NOIP2016提高A组8.12】通讯
【NOIP2016提高A组8.11】种树
【NOIP2016提高A组模拟9.9】爬山
【NOIP2017提高A组冲刺11.5】轰炸

Tarjan模板 人工栈版Tarjan相关推荐

  1. 洛谷1726 上白泽慧音 tarjan模板

    题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间 ...

  2. codeforces 427C tarjan模板题

    题意: 给你n个点每个点修建警察局的cost 对于这张图来说,与警察局在同一强联通分量里的每个点都可以被这个警察局照看  问你最小cost以及当前cost的方案数 思路: tarjan模板题~~~ ( ...

  3. 运维常见统计表模板(word版)

    运维常见统计表模板(word版) 背景: IT从业者工作繁忙,本身人员不够使,领导还天天催着各种报表.总结,做技术的就想着搞些实际的东西,不愿意整天沉浸在写总结的气氛里.下面例举了一些常见的运维报表模 ...

  4. C++ template类模板实现栈 pop push

    心得 data = new T[size];这句太坑了,一开始写成了data = new T(size)圆括号,所以一直随机性报错. 我本来以为是ide的问题,在vs2017里就会崩,在dev里不会崩 ...

  5. 模板实现栈队列以及链表

    模板实现链表 //test.h #include <iostream> #include <cstdio> #include <assert.h> using na ...

  6. 织梦蓝色简洁大气电脑操作系统软件下载网站模板 带手机版

    介绍: 织梦蓝色简洁大气电脑操作系统软件下载网站模板 带手机版 织梦内核开发的模板,这款模板使用范围广,不仅仅局限于一类型的企业,电脑操作系统.windows系统软件.软件下载类的网站都可以用该模板. ...

  7. 苹果cmsV10高仿草民电影网在线影视网站模板 带手机版

    介绍: 苹果cmsV10高仿草民电影网在线网站模板 带手机版 网盘下载地址: http://kekewl.cc/8obtG6AzODd0 图片:

  8. TOEFL 托福综合写作模板【高级版+低级版】

    高级版 低级版 高级版 In the lecture, the professor points out that ....听力中心思想...                        [1]ca ...

  9. endnote按照apa6th格式复制_APA Format 6th Edition TemplateAPA格式模板第六版.doc

    APA Format 6th Edition TemplateAPA格式模板第六版 Title of Paper Goes Here And I Will Also Add Here the Unne ...

最新文章

  1. Java 注解用法详解——@SuppressWarnings
  2. 【C010】Python - 基础教程学习(一)
  3. 【20160924】GOCVHelper 图像处理部分(2)
  4. 元素垂直水平居中布局
  5. Testing for SSL renegotiation
  6. Redis 持久化之RDB和AOF
  7. 【JLOI2013】地形生成
  8. 时间轴的实现(简单到爆炸)
  9. 移动设备input输入框点击后自动选中内容_带你用 Python 实现自动化群控(入门篇)...
  10. 如果有1千万以后不再有收入,没有任何理财方式,够花一辈子吗?
  11. element 表格数据过多时 进行鼠标移上去展示全部
  12. c lambda表达式 select 改变字段名称_拟提高回购价格上限至40.58元/股 吉宏股份称对未来业务发展有信心...
  13. kuangbin专题一 简单搜索
  14. 选择IT行业的自我心得,希望能帮助到各位!(一)
  15. jzxx1105 【入门】字符图形4-星号正三角
  16. vue中对鼠标划过事件处理方式
  17. win10无法装载重装系统iso文件_win10镜像不能安装系统如何解决_win10镜像无法安装处理方法...
  18. golang it营_深入理解Go-垃圾回收机制
  19. Vue中根据输入的身份证号识别年龄、性别
  20. drawArc 画扇形 画弧线

热门文章

  1. esp32与ros2的开关灯
  2. 说说short s = 1; s = s + 1;有没有问题?如果有怎么解决?
  3. 中图分类号和UDC查询
  4. ssm中小企业仓库管理信息系统毕业设计源码
  5. 输出图案-平行四边形
  6. 设置iframe高度的问题
  7. 制作windows服务(java)
  8. 6. unity之脚本
  9. java计算机毕业设计病人跟踪治疗信息管理系统演示2021源码+数据库+系统+lw文档+部署
  10. 【网络工程】9、实操-万达酒店综合项目(三)