poj 2117 Electricity (无向图割点去除后最大连通分支数)

题意:求去除一点后,形成的连通分支数的最大值。(使最多的网络不能跟原路线相连)

顶点u是割项当且仅满足 (1) 或 (2)时:

(1) 若u是树根,且u的孩子数 son>1 。因为没有u的后向边,以这些孩子为根的子树之间互不相连通,所以去掉u后将得到son个分支。

(2)若u不是树根,且存在树边 ( u  ,  v ) 使low ( v ) >= dfn ( u )。low值说明以v为根的子树不能到达u的祖先也就是去掉u后不能跟原图连通。(跟割绳子一样,一条绳子割n刀会形成 (n +1) 小段)所以得到 { 这样的v的个数 + 1 }个分支。

poj 2117 Electricity (无向图割点去除后最大连通分支数)_第1张图片

另外需要注意:

1.  若整个图没有边 ,则去掉一个点后,连通分支量为所有顶点数 -1 。

2.  因为是无向图,所以每个有边相连的子图都是一个连通分支。比如:

     n = 4   m = 2   :  (0  , 1)  (2   , 3) 就是两个连通分支。

     n = 3   m = 3   :  ( 0 , 1)  (1  , 2 ) (2 , 0)    整个图就是一个联通分支。

所以  :   ans =( 没有去除顶点u时的联通分支 - 1 )  + 去除顶点后新增的分支数 。

代码:

#include
#include
#include
#define mm 10010
using namespace std;

vector  vec[mm];
int  low[mm] , dfn[mm]  ;
int step  , son ,   ans , ma;
int n, m  ;

void init()
{
    for(int i=0;i=dfn[u])  
            {//cout<1)  ans=max(ans , son);
               ma=max(ma, ans);
            }//cout<<"ma= "<



你可能感兴趣的:(图论,关于程序)