强连通分量——tarjan
2016-07-26 11:09
302 查看
#include<stdio.h> #include<string.h> #include<stack> #include<vector> #include<iostream> #include<iomanip> using namespace std; stack<int> a; vector<int> g[100]; bool instack[100]; int dfn[100],low[100],time; void tarjan(int v) { dfn[v]=low[v]=++time; a.push(v),instack[v]=true; for(int i=0;i<g[v].size();i++) if(!dfn[g[v][i]]) { tarjan(g[v][i]); low[v]=min(low[v],low[g[v][i]]); } else if(instack[g[v][i]]) low[v]=min(low[v],low[g[v][i]]); if(dfn[v]==low[v]) { while(a.top()!=v) { cout<<a.top()<<" "; instack[a.top()]=false; a.pop(); } cout<<a.top()<<endl<<endl; a.pop(); } } int main() { int n,m,x,y,i; cin>>n>>m; while(m--) { scanf("%d%d",&x,&y); g[x].push_back(y); } memset(dfn,0,sizeof(dfn)); memset(instack,false,sizeof(instack)); while(!a.empty()) a.pop(); time=0; for(i=1;i<=n;i++) if(!dfn[i]) tarjan(i); }
相关文章推荐
- 什么是portlet?
- 算法:模拟算法
- HDU 1086 You can Solve a Geometry Problem too (判断线段相交)
- squid介绍及其简单配置
- Web学习笔记
- ppt写作的注意事项
- 并口编程 并口定义
- Ruby中 respond_to? 和 send 的用法 .
- PreferenceFragment详解
- ArcGIS教程:自定义地图范围(一)
- 自定义组合控件ViewGroup
- MongoDB 游标和索引
- Android Fragment使用详解及生命周期
- apache常用工作模式的区别
- 小编亲测杭州最火的海南鸡饭,最好吃的居然是……-搜狐吃喝!!!
- Redis快速入门
- Html与CSS快速入门02-HTML基础应用
- net.sf.json.JSONException: There is a cycle in the hierarchy!的解决办法
- jQuery.on() 函数详解 【转载】
- Yii 事件