#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 ;
}
hdu 4612
最新推荐文章于 2020-11-02 17:38:45 发布