求强连通分量之tarjan算法
2015-10-18 10:51
429 查看
tarjan算法优点在于时间复杂度的降低,由于每条边与每个顶点均遍历一次,故时间复杂度为O(n+m)。
关键字:深度优先搜索,栈(每个强连通分量相当于一个搜索树的子树,其顶点在栈中是连续的)
搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。
有篇很清楚的讲解文章:https://www.byvoid.com/blog/scc-tarjan/
pascal程序:
tarjan算法优点在于时间复杂度的降低,由于每条边与每个顶点均遍历一次,故时间复杂度为O(n+m)。
关键字:深度优先搜索,栈(每个强连通分量相当于一个搜索树的子树,其顶点在栈中是连续的)
搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。
有篇很清楚的讲解文章:https://www.byvoid.com/blog/scc-tarjan/
pascal程序:
var side:array[0..100,0..100] of boolean; //点x与点y是否连边(邻接矩阵) stack,dfn,low:array[0..100] of longint; //stack数组表示栈,dfn(u)为节点u搜索的次序编号,low(u)为u或u的子树能够追溯到的最早的栈中节点的次序号 v:array[0..100] of boolean; //节点x是否在栈中 deep,top,n,m,i,x,y:longint; //top是指栈的高度 function min(a,b:longint):longint; begin if a<b then min:=a else min:=b; end; procedure tarjan(x:longint); var i:longint; begin inc(deep); //初始赋值 dfn[x]:=deep;low[x]:=deep; //将x加入栈中 inc(top);stack[top]:=x; v[x]:=true; for i:=1 to n do if side[x,i] then begin if dfn[i]=0 then begin //节点i没被遍历过(很重要!) tarjan(i); low[x]:=min(low[x],low[i]); end else if v[i] then low[x]:=min(low[x],dfn[i]); end; if dfn[x]=low[x] then begin //当dfn(u)=low(u)时,以u为根的搜索子树上所有节点是一个强连通分量。 repeat v[stack[top]]:=false; write(stack[top],' '); //从上至节点x一一出站 dec(top); until stack[top+1]=x; writeln; end; end; begin fillchar(side,sizeof(side),false); readln(n,m); for i:=1 to m do begin readln(x,y); side[x,y]:=true; end; top:=0; deep:=0; for i:=1 to n do if dfn[i]=0 then tarjan(i); readln; end.
相关文章推荐
- hdu1827&&hdu2767----Kosaraju算法
- hdu3072&&hdu3639----Kosaraju算法
- BZOJ 1502 NOI 2005 月下柠檬树
- [BZOJ1499][NOI2005][DP+优化]瑰丽华尔兹
- [BZOJ2006][NOI2010][RMQ/主席树][二叉堆]超级钢琴
- [BZOJ1797][AHOI2009][最大流][强连通分量]Mincut最小割
- [BZOJ2330][SCOI2011][拓扑排序][强连通分量][Tarjan]Candy
- [BZOJ1500][NOI2005][Splay]维修数列
- [BZOJ1507][NOI2003][Rope]Editor
- [BZOJ1492][NOI2007][斜率优化][动态凸包][DP][分治]货币兑换cash
- NOI2008 Day 1 解题报告
- MZ Training 2014 #4 C题
- NOI2015结束,从此我要全力以赴奋战OI
- 图论算法(6) --- Tarjan算法求强连通分量
- 图论算法(6)(更新版) --- Tarjan算法求强连通分量
- [BZOJ3668][NOI 2014]起床困难综合症
- POJ3114 Country in Wars Tarjan+Dij
- tarjan算法原理介绍
- 【算法学习】强连通分量
- POJ 1523 / ZOJ 1119 - Tarjan算法