强连通分量Tarjan算法
2016-08-23 11:56
281 查看
O ( V+E )
通常的Tarjan写法是有个dfn[]数组跟一个instack[]数组,我精简了下代码,把这两个数组都删去了,用更简便的写法代替,也省了空间。
通常的Tarjan写法是有个dfn[]数组跟一个instack[]数组,我精简了下代码,把这两个数组都删去了,用更简便的写法代替,也省了空间。
int low[maxn]; // 记录这棵树能到达的最早祖先(其实不一定是最早,但不影响使用) int time; // 时间戳 int num; // 连通分量的个数 int belong[maxn]; // 记录属于哪个连通分量 int sta[maxn]; // 手写栈 int top; // 栈顶 void init(){ num = time = top = 0; memset(low,-1,sizeof(low)); memset(belong,-1,sizeof(belong)); } void tarjan(int p){ int t=time; // 记录下访问到该点时的时间戳,就不用dfn数组啦 low[p]=time++; sta[top++]=p; for(int i=v[p].size()-1;i>=0;i--){ int next=v[p][i]; if(low[next]==-1){ // 没有被访问过 tarjan(next); low[p]=min(low[p],low[next]); } else if(belong[next]==-1) // 还在栈内 (只要出栈了,belong的值肯定已经确定了,这种判断方式就省了instack数组了) low[p]=min(low[p],low[next]); } if(low[p]==t){ while(1){ int i=sta[--top]; belong[i]=num; // 连通分量编号从0开始 if(i==p)break; } num++; } } void Solve(){ init(); for(int i=1;i<=n;i++) if(low[i]==-1) tarjan(i); }
相关文章推荐
- 有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,
- 求强连通分量的Tarjan算法
- Zoj 1119 POJ 1523 SPF 求关节点及删除关节点会出现多少个连通分量 Tarjan算法
- tarjan算法求强连通分量
- 有向图强连通分量的Tarjan算法
- 【转载】有向图强连通分量的Tarjan算法
- Kosaraju算法、Tarjan算法分析及证明--强连通分量的线性算法
- [有向图的强连通分量][Tarjan算法]
- POJ 2186 Popular Cows(强连通分量缩点,Tarjan算法)
- 有向图强连通分量 Tarjan算法【java实现】
- 有向图强连通分量 Tarjan算法【java实现】
- 有向图强连通分量的Tarjan算法
- 有向图强连通分量的Tarjan算法
- 有向图强连通分量的Tarjan算法
- 有向图的强连通分量之Tarjan算法
- 有向图的强连通分量 Tarjan算法
- [有向图的强连通分量][Tarjan算法]
- 有向图强连通分量的Tarjan算法(转)
- HDU1269——迷宫城堡(有向图求强连通分量,Tarjan算法)
- 有向图强连通分量 Tarjan算法【java实现】