hdu 4612


#pragma comment(linker, "/STACK:102400000,102400000")

using namespace std ;

typedef long long LL ;
const int maxn = 200008 ;
const int maxm = 2000008 ;

struct E{
       int v , next ;
       int vis ;
}e[maxm] ;

int eid , g[maxn] ;
void add(int u , int v){
     e[eid].v = v ;
     e[eid].vis = 0 ;
     e[eid].next = g[u] ;
     g[u] = eid++ ;
}

//---------------
int   low[maxn] , dfn[maxn] , dfntime ;
int   _stack[maxn] , top ;
bool  _instak[maxn] ;
//--------------
int   belong[maxn] , bcc , bccsum[maxn] ;

void tarjan(int u){
     low[u] = dfn[u] = ++dfntime ;
     _stack[++top] = u ;
     _instak[u] = 1 ;
     for(int i = g[u] ; i != -1 ; i = e[i].next){
           if(e[i].vis) continue ;
           e[i].vis = e[i^1].vis = 1 ;
           int v = e[i].v ;
           if(! dfn[v]){
               tarjan(v) ;
               low[u] = min(low[u] , low[v]) ;
           }
           else if(_instak[v])  low[u] = min(low[u] , dfn[v]) ;
     }
     if(low[u] == dfn[u]){
          bcc++ ;
          int v  ;
          do{
              v = _stack[top--] ;
              _instak[v] = 0 ;
              belong[v] = bcc ;
              bccsum[bcc]++ ;
          }while(v != u) ;
     }
}

void inittarjan(){
     dfntime = 0 ;
     eid = 0 ;
     memset(g , -1 , sizeof(g)) ;
     memset(dfn , 0 , sizeof(dfn)) ;
     memset(low , 0 , sizeof(low)) ;
     memset(_instak , 0 , sizeof(_instak)) ;
     top = 0 ;
     bcc = 0 ;
     memset(bccsum , 0 , sizeof(bccsum)) ;
}


E e2[maxm] ;
int eid2 , g2[maxn] ;
void add2(int u , int v){
     e2[eid2].v = v ;
     e2[eid2].next = g2[u] ;
     g2[u] = eid2++ ;
}

const int inf = 100000000 ;
int  dist[maxn] ;
int  spfa(int u){
     for(int i = 0 ; i <= bcc ; i++)  dist[i] = inf ;
     dist[u] = 0 ;
     queue<int> q ;
     q.push(u) ;
     while(! q.empty()){
          int u = q.front() ; q.pop() ;
          for(int i = g2[u] ; i != -1 ; i = e2[i].next){
               int v = e2[i].v ;
               if(dist[v] > dist[u] + 1){
                    dist[v] = dist[u] + 1 ;
                    q.push(v) ;
               }
          }
     }
     return max_element(dist+1 , dist+1+bcc) -  dist ;
}

int main(){
    int n , m , u , v , t ;
    while(scanf("%d%d" , &n , &m)){
         if(n == 0 && m == 0)  break ;
         inittarjan() ;
         while(m--){
              scanf("%d%d" , &u , &v) ;
              add(u , v) ;
              add(v , u) ;
         }

         for(int i = 1 ; i <= n ; i++){
               if(! dfn[i]) tarjan(i) ;
         }

         eid2 = 0 ;
         memset(g2 , -1 , sizeof(g2)) ;
         for(int u = 1 ; u <= n ; u++){
              for(int i = g[u] ; i != -1 ; i = e[i].next){
                   int v = e[i].v ;
                   int bu = belong[u] ;
                   int bv = belong[v] ;
                   if(bu != bv){
                            add2(bu , bv) ;
                   }
              }
         }
         u = spfa(1) ;
         u = spfa(u) ;
         printf("%d\n" , bcc - dist[u] - 1)  ;
    }
    return 0 ;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值