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算法------------------