ccf+tarjan+求有向图的强连通分量
2016-04-06 11:34
232 查看
点击打开链接
///tarjan的强连通分量 #include<iostream> #include<cstdio> #include<cstring> #include<stack> using namespace std; const int maxn=1e4+5,maxm=1e5+5; struct Side { int to,next; }side[maxm]; int node[maxn],low[maxn],dfn[maxn],belong[maxn]; int top,n,m,t,cur,ans=0,sum=0; stack<int>s; void add_side(int u,int v) { side[top]=(Side){v,node[u]}; node[u]=top++; } void dfs(int u) { if(dfn[u]) return; dfn[u]=low[u]=t++; s.push(u); for(int i=node[u];i!=-1;i=side[i].next){ int v=side[i].to; dfs(v); if(dfn[v]!=-1) low[u]=min(low[u],low[v]); } int temp; if(low[u]==dfn[u]){ sum=0;//初始化 do{ temp=s.top(); s.pop(); belong[temp]=cur; dfn[temp]=-1; sum++;///一个强连通分量中点的个数 }while(temp!=u); cur++;///强连通分量的个数。 ans+=(sum*(sum-1))/2; } } int main() { scanf("%d%d",&n,&m); top=0; memset(node,-1,sizeof(node)); memset(dfn,0,sizeof(dfn)); while(m--){ int a,b; cin>>a>>b; add_side(a,b); } t=1,cur=1;///时间戳,强连通分量 for(int i=1;i<=n;i++){///从1开始 if(!dfn[i]){ dfs(i); } } printf("%d\n",ans); return 0; }
相关文章推荐
- poj 1125Stockbroker Grapevine
- 面相对象设计总结
- iOS开发之微信支付
- UiAutomator viewer 在tools下启动、资源jar包在platforms下(如android22)
- linux用户管理中两个重要的“父子”配置文件
- C#操作SharePoint文档库文档
- ID、Class和标签选择器优先级
- maven编译时如何忽略单元测试
- MySQL行锁深入研究
- 【bzoj 2132】圈地计划(最小割)
- 源码分析之ArrayList
- Xcode language not recognized: 'ml2'
- [构架]马斯克软件思维
- UVa 540 Team Queue
- 费波拉契问题的变形
- 对指定文件(一个或多个)进行压缩,并存放到指定路径
- 图像处理工具 ImageMagick
- 进入项目文件
- Android ORMLite 框架的入门用法
- linux第三章学习笔记