博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tarjan缩点
阅读量:4635 次
发布时间:2019-06-09

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

心魔

塔扬缩点是我长时间不想学的算法了。。。并查集能解决的事绝对不用并查集!!!,然而,随着题目难度加深,我发现有些题目不得不用Tarjan解决,而且现对于并查集而言,思维量可以大大减少,所以这里写下这篇博客,算个纪念吧

Tarjan是一位非常操蛋帅的人,发明了了大量的算法,什么并查集求LCA啊,什么SPLAY啊...不过最出名的还是他发明的缩点算法

正文

首先,什么叫缩点呢?我们需要先理解什么是强连通分量

强连通分量指的是:在一个有向图中,强联通分量的点可以互相到达,如在下图中,一块黄的就是一个强联通分量

timg?image&quality=80&size=b9999_10000&sec=1521727943842&di=7b5b01154bc2c0b9f2332f5cf651be95&imgtype=0&src=http%3A%2F%2Fpic002.cnblogs.com%2Fimages%2F2011%2F320166%2F2011080420270658.jpg

其实我不太说的清楚原理,直接上代码注释好了:

int DFN[maxn],LOW[maxn],index;//序号及环开头的序号int S[maxn],top;//手写栈bool ins[maxn];//是否进栈int col[maxn],numc;//染色void Tarjan(int u){    DFN[u] = LOW[u] = ++index;    S[++top] = u;//进栈    ins[u] = true;    for(int i = head[u];i;i = E[i].nxt){        int v = E[i].v;        if(!DFN[v]){            Tarjan(v);            LOW[u] = min(LOW[u],LOW[v]);//找爸爸(环开头)最小的            }        else if(ins[v]){            LOW[u] = min(LOW[u],DFN[v]);//判断谁是爸爸            }        }    if(DFN[u] == LOW[u]){//发现更新完一轮自己是爸爸        numc++;        while(S[top + 1] != u){            col[S[top]] = numc;//出栈,染色            ins[S[top--]] = false;            }        }    }

关于Tarjan缩点的技巧

我们分两种情况:

1.题目直接考Tarjan(重点)

这种情况一般是直接考缩点,通常和图论的知识连用,而又以出度入度最为常见

首先如果原图是一个无向又环图,我们是没办法对其进行某些操作的(比如可以重复走一条路但是点权只加一次这类的),因为要重复访问,所以DFS就毫无用武之地了,这时候我们就需要又Tarjan,在跑Tarjan的时候处理环的某些性质(如点权什么的),在建新图,就可以在新图上进行dp或者遍历了。

2.题目考其他

这里不再赘述,Tarjan就是一个辅助作用,把有环图缩为无环图,就可以使用一些算法解决问题了

最近刷的Tarjan的题:

P2002 消息扩散 (与入度连用)

P2341 [HAOI2006]受欢迎的牛 (与出度连用)

P2746 [USACO5.3]校园网Network of Schools (入度和出度)

P2863 [USACO06JAN]牛的舞会The Cow Prom (图论知识及对强联通的理解)

P2835 刻录光盘 (同上)

P3387 【模板】缩点

转载于:https://www.cnblogs.com/Tony-Double-Sky/p/9285458.html

你可能感兴趣的文章
hbase 概念
查看>>
多态方法调用的解析和分派
查看>>
JS函数addEventListener的浏览器差异性封装
查看>>
精读《V8 引擎 Lazy Parsing》
查看>>
SNF软件开发机器人-子系统-导出-导入功能-多人合作时这个功能经常用到
查看>>
一本通1629聪明的燕姿
查看>>
今天是我开通博客的第一天
查看>>
mysql基础操作
查看>>
【Netty】ChannelHandler和ChannelPipeline
查看>>
Spring Boot2.0+中,自定义配置类扩展springMVC的功能
查看>>
windows下部署免费ssl证书(letsencrypt)
查看>>
字符串处理示例--列车车次查询.sql
查看>>
Erlang 位串和二进制数据
查看>>
图片上传
查看>>
H5学习之旅-H5列表(8)
查看>>
华为机试题【10】-求数字基root
查看>>
ISLR—第二章 Statistical Learning
查看>>
软件与程序
查看>>
tiny4412u-boot烧写及根文件系统制作(不进入终端问题)
查看>>
谁说菜鸟不会数据分析--读书笔记
查看>>