模板整理: 图论---tarjan缩点/桥/割点
来源:互联网 发布:怎么运行java文件 编辑:程序博客网 时间:2024/05/22 10:23
tarjan这算法没学好……气哦
目前掌握得还可以的只有缩点,
每次桥和割点只能手推。。还总是推错。
说实话也没什么难的啊。。
缩点,桥,割点之前的学习笔记
先是缩点,也就是强连通分量双联通分量这些东西。
只讨论强连通分量。
比较好理解,用DFN[u]表示到达u的时间(时间戳),
LOW[u]表示u及u的子树中能到达的最早时间戳.
那么想象一下,一个强连通分量,里面有某个u,
把u提起来,那么包含u的最大的强连通分量,
看上去一定是个像环一样的东西(其实复杂得多)
那么一定满足LOW[u]=DFN[u],这个很好脑补吧。。
所以访问完u的所有子树之后判断
LOW[u]是否等于DFN[u]即可。
每次访问一个点的时候,将这个点入栈,
然后如果LOW[u]=DFN[u],就一直从栈内弹出元素,
直到u为止即可。
双连通分量类似于强连通分量,但是对于无向边,
我们一般都是多加一条反向边的,
所以求双连通分量的时候,要注意不能走回它的父亲去
(除非这两个点之间有多条不同边)
//强连通分量缩点的模板//instack[u]=1,当u在栈内;stk[]为存放元素的栈//sccnum是强连通分量(scc)的个数,//sz[i]是第i个scc含有的点数//scc[i]表示(原图里)i号点属于第scc[i]个强连通分量void tarjan(int u){ DFN[u]=LOW[u]=++Time; instack[u]=1,stk[++top]=u; for (int i=head[u];i;i=E[i].next){ int v=E[i].to; if (!DFN[v]){ tarjan(v); LOW[u]=min(LOW[u],LOW[v]); } else if (instack[v]) LOW[u]=min(LOW[u],DFN[v]); } if (DFN[u]==LOW[u]){ sz[++sccnum]=1; while (stk[top]!=u){ instack[stk[top]]=0; scc[stk[top--]]=sccnum; sz[sccnum]++; } instack[stk[top]]=0; scc[stk[top--]]=sccnum; }}
然后是桥,桥的定义大致可以理解为:
假如去掉了(u->v)这条边,那么将会产生两个连通块(也就是u和v不再连通)
假设(u->v)是桥,那么u满足什么性质呢?
同样看作把u拎起来,那么对于u的所有儿子(也就是所有的v),
儿子能到达的最早时间戳(也就是LOW[v])一定不会越过u,
就是DFN[u]>LOW[v],(雾。。应该不难理解吧?)
这样子的话每次判断一下就可以得出(u->v)是不是桥了。
最后是割点。与之前的处理方法类似,从时间戳的角度出发。
假设把u拎起来,那么u子树内的节点不能到达u之上的部分(最多到u)
也就是DFN[u]>=LOW[v],
还有一种情况,就是u为根而且至少有2个儿子的时候,
都判断一下就好了。
唔。。似乎没有模板= =
可以看这里
里面基本注明了。
缩点是真的有用。。。
- 模板整理: 图论---tarjan缩点/桥/割点
- poj3177 tarjan缩点+割边 模板 【pascal】
- tarjan原理,割点,桥
- poj 1144 Network (tarjan割点模板)
- tarjan最小割点算法模板
- Tarjan缩点模板
- 割点,桥模板
- 割点、桥模板
- poj2117 tarjan()+割点
- 【tarjan】【割点】
- tarjan 割点
- tarjan缩点/求桥模板
- 【学习笔记】图论 Tarjan LCA 割点 桥 暑假7.5
- tarjan求桥及割点
- 割点和桥---Tarjan算法
- Tarjan算法求桥和割点
- 割点和桥模板
- 割点和桥模板
- 【noip2015】子串
- 机器学习备忘录(持续记录)
- Linux学习 [2] vi编辑器 gcc工具链 make和Makefile gdb调试工具
- #android#刚接触android编程遇到的几个问题
- 从酷铺商贸新零售计划入手,来分析海航怎么样
- 模板整理: 图论---tarjan缩点/桥/割点
- 大数据解读中国高铁
- 使用PrintWriter和BufferedReader完成文件拷贝工作
- NLPCC2017 | AISpeech Night学术交流晚宴等你来!
- ajax + php 登陆功能
- Java 调用Oracle存储过程
- lvs实现四层负载DR模式
- Android中图片setImageResource和setBackgroundResource的区别
- 微信公号“架构师之路”学习笔记(五)-数据库扩展性架构设计(水平切分,秒级扩容,平滑迁移,在线表结构变更,一个大数据量多属性高并发的数据库设计等)