poj 1144 割点
2015-08-04 09:57
267 查看
最基本的求割点的题目,建议深入理解该dfs的过程,还有就是对于同一个点来说,满足它是割点的条件可能会成立多次,所以一定要在dfs结束后统计割点个数,而不是在dfs的过程中实现。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N = 200; const int M = 500; int dfn ; int low ; int head ; bool is_cut ; int n, e, dfs_clock; void init() { e = dfs_clock = 0; memset( head, -1, sizeof(head) ); memset( dfn, 0, sizeof(dfn) ); memset( is_cut, 0, sizeof(is_cut) ); } struct Edge { int v, next; } edge[M]; void addEdge( int u, int v ) { edge[e].v = v; edge[e].next = head[u]; head[u] = e++; } void dfs( int u, int fa ) { low[u] = dfn[u] = ++dfs_clock; int cnt = 0; for ( int i = head[u]; i != -1; i = edge[i].next ) { int v = edge[i].v; if ( !dfn[v] ) { cnt++; dfs( v, u ); if ( low[v] >= dfn[u] ) is_cut[u] = true; low[u] = min( low[u], low[v] ); } else if ( v != fa ) { low[u] = min( low[u], dfn[v] ); } } if ( fa < 0 && cnt == 1 ) is_cut[u] = false; } int main () { while ( scanf("%d", &n), n ) { init(); int u, v; while ( scanf("%d", &u), u ) { while ( getchar() != '\n' ) { scanf("%d", &v); addEdge( u, v ); addEdge( v, u ); } } dfs( 1, -1 ); int ans = 0; for ( int i = 1; i <= n; i++ ) { if ( is_cut[i] ) ans++; } printf("%d\n", ans); } return 0; }
相关文章推荐
- js之iframe子页面与父页面通信
- Java通过调用FFMPEG获取视频时长
- 初识Axure
- 关于Android的HAL的一些理解
- Android GUI之View测量
- JAVA 生成PDF报表()
- make subversion时出现neon报错 及 svn其他问题汇总(3ge )
- 南邮 OJ 1054 回文回文!
- g++的编译及调试
- HDU 3473 Minimum Sum (划分树)
- uva 10935 卡片游戏【队列】
- MySQL初学者入门教程
- php关于url、文件、目录、ip的相关问题汇总
- python3入门之赋值语句介绍
- WPF ,listbox,平滑滚动的2种方式。
- laravel框架中widget模糊查询
- Unable to convert data to string around character 11.
- EL表达式里面fn的用法
- AStyle代码格式工具在source insight中的使用
- 南邮 OJ 1053 恶魔城