您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: