Tarjan模板 人工栈版Tarjan
引入
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相关推荐
- 洛谷1726 上白泽慧音 tarjan模板
题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间 ...
- codeforces 427C tarjan模板题
题意: 给你n个点每个点修建警察局的cost 对于这张图来说,与警察局在同一强联通分量里的每个点都可以被这个警察局照看 问你最小cost以及当前cost的方案数 思路: tarjan模板题~~~ ( ...
- 运维常见统计表模板(word版)
运维常见统计表模板(word版) 背景: IT从业者工作繁忙,本身人员不够使,领导还天天催着各种报表.总结,做技术的就想着搞些实际的东西,不愿意整天沉浸在写总结的气氛里.下面例举了一些常见的运维报表模 ...
- C++ template类模板实现栈 pop push
心得 data = new T[size];这句太坑了,一开始写成了data = new T(size)圆括号,所以一直随机性报错. 我本来以为是ide的问题,在vs2017里就会崩,在dev里不会崩 ...
- 模板实现栈队列以及链表
模板实现链表 //test.h #include <iostream> #include <cstdio> #include <assert.h> using na ...
- 织梦蓝色简洁大气电脑操作系统软件下载网站模板 带手机版
介绍: 织梦蓝色简洁大气电脑操作系统软件下载网站模板 带手机版 织梦内核开发的模板,这款模板使用范围广,不仅仅局限于一类型的企业,电脑操作系统.windows系统软件.软件下载类的网站都可以用该模板. ...
- 苹果cmsV10高仿草民电影网在线影视网站模板 带手机版
介绍: 苹果cmsV10高仿草民电影网在线网站模板 带手机版 网盘下载地址: http://kekewl.cc/8obtG6AzODd0 图片:
- TOEFL 托福综合写作模板【高级版+低级版】
高级版 低级版 高级版 In the lecture, the professor points out that ....听力中心思想... [1]ca ...
- 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 ...
最新文章
- Java 注解用法详解——@SuppressWarnings
- 【C010】Python - 基础教程学习(一)
- 【20160924】GOCVHelper 图像处理部分(2)
- 元素垂直水平居中布局
- Testing for SSL renegotiation
- Redis 持久化之RDB和AOF
- 【JLOI2013】地形生成
- 时间轴的实现(简单到爆炸)
- 移动设备input输入框点击后自动选中内容_带你用 Python 实现自动化群控(入门篇)...
- 如果有1千万以后不再有收入,没有任何理财方式,够花一辈子吗?
- element 表格数据过多时 进行鼠标移上去展示全部
- c lambda表达式 select 改变字段名称_拟提高回购价格上限至40.58元/股 吉宏股份称对未来业务发展有信心...
- kuangbin专题一 简单搜索
- 选择IT行业的自我心得,希望能帮助到各位!(一)
- jzxx1105 【入门】字符图形4-星号正三角
- vue中对鼠标划过事件处理方式
- win10无法装载重装系统iso文件_win10镜像不能安装系统如何解决_win10镜像无法安装处理方法...
- golang it营_深入理解Go-垃圾回收机制
- Vue中根据输入的身份证号识别年龄、性别
- drawArc 画扇形 画弧线