LCA


//http://acm.hdu.edu.cn/showproblem.php?pid=2586
#include
#define LOCAL
using namespace std;
const int maxn=40010;
vector vlg[maxn];
vector dis[maxn];
int cost[20][maxn]; // cost[i][j] -->the distance of the 2^i_th ancestor and j
int fa[20][maxn];   // fa[i][j]--> the 2^i_th ancestor of j 
int dep[maxn];
//read改良版
int read(){
    int s=0,f=1,c=getchar();
    while(c<'0' || c>'9') { if (c=='-') f=-1;c=getchar();}
    // while(c>='0' && c<='9') {s=s*10+c-'0';c=getchar();}
    while (c>='0' && c<='9') { s=(s<<3)+(s<<1)+c-'0'; c=getchar();}
    return f*s;
}
// the default root is 1 and the default ancestor of 1 is 0
void dfs(int cld,int ftr){
    // cout<>=1;
        bt++;
    }
    if (i==j) return ans;
    if (dep[i]!=dep[j]) cout<<"Error!\n";
    //这里涉及一点数学--当利用一直条件不能直接求得结果,要能够间接的逼近这个数,然后得到这个结果
    // 二进制的思想:对于一个数的二进制形式,在原来位数上面的0的地方变成1,0后面的数全部变为0,都会导致该数增大!所以在确保小于的情况下,最终一定到达目标结果-1
    for (int k=20;k>=0;--k){
        if (fa[k][i]!=fa[k][j]){
            ans+=cost[k][i];
            ans+=cost[k][j];
            i=fa[k][i];
            j=fa[k][j];
        }
        if (i==j) cout<<"Error!\n";
    }
    ans+=cost[0][i]+cost[0][j];
    // cout<

------------接下来要实现tarjon算法------------------