点双连通
2015-07-14 18:06
316 查看
#include <cstdio> #include <vector> using namespace std; const int N = 1000+10; const int M = N*N; struct Edge { int u, v; Edge( int u, int v ):u(u),v(v){} }; int n, m; int head , dest[M], next[M], etot; int dfn , low , bccno , iscut , bcc_cnt, idc; vector<int> bcc ; vector<Edge> stk; void adde( int u, int v ) { etot++; dest[etot] = v; next[etot] = head[u]; head[u] = etot; } void dfs( int u, int fa ) { dfn[u] = low[u] = ++idc; int child = 0; for( int t=head[u]; t; t=next[t] ) { int v=dest[t]; if( v==fa ) continue; stk.push_back( Edge(u,v) ); if( !dfn[v] ) { dfs(v,u); low[u] = min( low[u], low[v] ); child++; if( low[v]>=dfn[u] ) { iscut[u] = true; bcc_cnt++; while(1) { Edge e=stk.back(); stk.pop_back(); if( !bccno[e.u] ) bccno[e.u]=bcc_cnt,bcc[bcc_cnt].push_back(e.u); if( !bccno[e.v] ) bccno[e.v]=bcc_cnt,bcc[bcc_cnt].push_back(e.v); if( e.u==u && e.v==v ) break; } } } else if( dfn[v]<dfn[u] ) { low[u] = min( low[u], dfn[v] ); } } if( u==fa && child<=1 ) iscut[u]=false; } int main() { scanf( "%d%d", &n, &m ); for( int i=1,u,v; i<=m; i++ ) { scanf( "%d%d", &u, &v ); adde( u, v ); adde( v, u ); } dfs(1,1); for( int u=1; u<=n; u++ ) if( iscut[u] ) printf( "%d ", u ); printf( "\n" ); }
View Code
相关文章推荐
- struts国际化操作中遇到display标签的处理办法
- Android中OptionMenu用法实例
- HTML和CSS的关键:盒子模型(Box model)
- Scala : 主构造器、私有构造器、构造器重载
- OpenWrt的swconfig结构框架
- Spring MVC拦截器配置及其原理分析
- 关于ImageLoadingProgressListener不执行的囧事儿。
- ASP.NET MVC系列:Area
- Spring-MVC4 + JPA2 + MySql-5.5 + SLF4J + JBoss WildFly-8.1开发环境的搭建
- GIT使用总结
- Mongodb与Redis应用指标对比
- 1.Linux网络栈下两层实现
- Linux 网桥配置命令:brctl
- 在Windows上和Linux上安装xdebug
- C++的运算符重载
- java4大基本算法加密解析
- ViewPager实现可以自动滚动的广告展示
- Android中实现定时器的三种方法
- XUtils中Bitmap设置的图片如何平铺满
- Android中实现定时器的三种方法 分类: Android 2015-07-14 18:04 11人阅读 评论(0) 收藏