算法模板——Tarjan算法
来源:互联网 发布:广州淘宝代运营诈骗 编辑:程序博客网 时间:2024/06/05 11:48
Tarjan算法是一种用来求强连通分量的算法。
什么是强连通分量?
一个有向图的极大强连通子图叫做强连通分量。就是说,一个图的一个子图是强连通图,再加进一个点和与之相邻的边,那么这个图就不是强连通图,这样这个子图是原图的强连通分量。
确定一些名词
首先每张图都有一棵dfs树,树上的边叫树边。
从这棵树的一个节点到自己的儿孙节点且不是树边的边叫做前向边。
从这棵树的一个节点到自己的祖先节点的边叫做返祖边。
从一个节点的一棵子树到另一棵子树的边叫做横叉边。
如何确定一个图的强连通分量?
一个点
伪代码
int tarjan(int u){ dfn[u]=low[u]=++cnt; for(v=u的每一个儿子){ if(v没有被搜过){ tarjan(v); low[u]=min(low[v],low[u]); } else if(v在栈内) { low[u]=min(dfn[v],low[u]); } } if(dfn[u]==low[u]) { 将栈中u及u以上的点都弹出并标记为同一个强连通分量; } return 0;}
为什么呢?
一个强连通分量必定是dfs树的一棵子树。
首先处理返祖边,有返祖边说明从这个点的这个祖先到这个点自己这条链都是一个强连通分量。树边的话显然这个点的
具体细节看代码好了。
代码
const int maxn=10000;const int maxm=100000;struct stack//普通的栈{ int s[maxn+10],head; int push(int x) { head++; s[head]=x; return 0; } int pop() { head--; return 0; } int top() { return s[head]; } int size() { return head; }};struct ta{ int pre[maxm+10],now[maxn+10],son[maxm+10],tot;//存图 int dfn[maxn+10],cnt,low[maxn+10],belong[maxn+10],b[maxn+10],total; stack st; int ins(int a,int b)//插入边 { tot++; pre[tot]=now[a]; now[a]=tot; son[tot]=b; return 0; } int tarjan(int u) { cnt++; dfn[u]=low[u]=cnt; int j=now[u]; st.push(u);//将这个点入栈 b[u]=1;//b数组标记是否在栈内 while(j) { int v=son[j]; if(!dfn[v]) { tarjan(v); if(low[v]<low[u])//处理树边 { low[u]=low[v]; } } else { if((b[v])&&(dfn[v]<low[u]))//这里前一个条件处理了横叉边 { low[u]=dfn[v];//这里处理前向边和返祖边 } } j=pre[j]; } if(low[u]==dfn[u])//可以确定强连通分量了 { total++; do//将栈内的元素弹出 { j=st.top(); belong[j]=total; b[j]=0; st.pop(); } while(j!=u); } return 0; }};
阅读全文
0 0
- 算法模板——Tarjan算法
- tarjan算法模板
- Tarjan算法模板
- Tarjan算法 模板
- Tarjan 算法&模板
- Tarjan算法模板
- SCC的Tarjan算法模板
- Tarjan算法模板 详解
- LCA离线tarjan算法模板
- LCA离线tarjan算法模板
- hdu 1269 tarjan算法模板
- tarjan 算法模板(边连通分量)
- 强连通分量-tarjan算法模板详解
- 强连通分量tarjan算法模板
- HDU 1269 强连通模板 Tarjan算法
- 求割点模板(tarjan算法思路)
- 强联通分量 Tarjan算法 模板
- tarjan算法模板(强连通分量)
- 成为一个不惑、不忧、不惧的人(梁启超演讲节选)
- jQuery-$ is not a function
- js中const,var,let区别
- finally语句中对变量进行赋值的问题
- 关于定位锚点 返回相应位置的两种方式
- 算法模板——Tarjan算法
- JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐(二)
- JPA Predicate复杂查询排序
- MySQL学习(四)【MySQL应用优化】
- Java读取XML文件的内容
- Windows下使用GetOpt函数使用
- TypeError: __init__() got an unexpected keyword argument 'shape'
- linux 内存管理的slab机制分析
- 数值的整数次方