设为首页 加入收藏

TOP

poj1523 解题报告(一)
2012-11-30 12:26:30 来源: 作者: 【 】 浏览:869
Tags:poj1523  解题 报告

    题意:给出一个无向图,要求找出每个割点,以及除去割点之后能把图分成几个连通块

    题解:点的双联通,统计割点属于多少个连通块

    代码:

    [cpp]

    #include <iostream>

    #include <cstring>

    #include <cstdio>

    using namespace std ;

    const int MAXN = 1005 ;

    struct type

    {

    int  end , next ;

    } ;

    type  edge[MAXN*MAXN] ;

    int   head[MAXN] , Count , top ;

    int   low[MAXN] , dfn[MAXN] , stack[MAXN] , vis[MAXN] , ans[MAXN] ; // ans是每个点属于的集合的数量,大于1就是割点了

    void  addedge( int start , int end )

    {

    edge[Count].end  = end         ;

    edge[Count].next = head[start] ;

    head[start]      = Count ++    ;

    }

    void  tarjan_dfs( int cur , int father , int &cnt , int &Time )

    {

    dfn[cur] = low[cur] = Time ++ ;

    vis[cur] = 1 ;

    for( int i = head[cur] ; i != -1 ; i = edge[i].next )

    {

    int  end = edge[i].end ;

    if( end == father ) continue ;

    if( !vis[end] )

    {

    tarjan_dfs( end , cur , cnt , Time )   ;

    low[cur] = min( low[cur] , low[end] )  ;

    if( dfn[cur] <= low[cur] ) ans[cur] ++ ; // dfn = low 也可以

    }

    else low[cur] = min( low[cur] , dfn[end] ) ;

    }

    }

    int  tarjan( int N )

    {

    int  Time = 0 , cnt = 0 ;

    top = 0 ;

    memset( dfn , 0 , sizeof( dfn ) ) ;

    memset( low , 0 , sizeof( low ) ) ;

    memset( vis , 0 , sizeof( vis ) ) ;

    tarjan_dfs( 1 , -1 , cnt , Time ) ;

    return cnt ;

    }

   

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇xml解析生成pdf,word文档 下一篇C++类信息的隐藏

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: