DFS1
void DFS1( int x , int f , int deep ) {
fa[x] = f ;
dep[x] = deep ;
Size[x] = 1 ;
for( int i = 0 ; i < G[x].size() ; ++ i ) {
int s = G[x][i] ;
if( s == f )
continue;
DFS1( s,x,deep+1 );
Size[x] += Size[s] ;
if( Size[s] > Size[son[x]] || !son[x] )
son[x] = s ;
}
}
DFS2
void DFS2( int x , int T ) {
top[x] = T ;
cnt ++ ;
id[x] = cnt ;
be[cnt] = x ;
if( !son[x] )
return ;
DFS2( son[x] , T );
for( int i = 0 ; i < G[x].size() ; ++ i ) {
int s = G[x][i] ;
if( s == son[x] || s == fa[x] )
continue ;
DFS2(s,s);
}
}
LCA
int Get_sum( int x , int y ) {
while( top[x] != top[y] ) {
if( dep[top[x]] < dep[top[y]] )
swap(x,y) ;
x = fa[top[x]] ;
}
if( dep[x] < dep[y] )
swap(x,y) ;
return y ;
}
LCA树剖模板
#include
#include
#include
#include
#include
#include