您的位置:首页 > 其它

倍增LCA模板

2017-06-03 16:42 381 查看
const int M = 20;
struct node{
int v, value, next;
}p[maxn << 1];
int len, head[maxn], dis[maxn], depth[maxn], n, m, father[maxn][25];
void addedge(int u, int v, int value){
p[len].v = v;
p[len].value = value;
p[len].next = head[u];
head[u] = len++;
}
void dfs(int x, int fa){
father[x][0] = fa;
for (int i = head[x]; ~i; i = p[i].next){
if (p[i].v == fa)
continue;
dis[p[i].v] = dis[x] + p[i].value;
depth[p[i].v] = depth[x] + 1;
dfs(p[i].v, x);
}
}
void presolve(){
dis[1] = depth[1] = 0;
dfs(1, 0);
for (int i = 1; i < M; i++)  
        for (int j = 1; j <= n; j++)  
            father[j][i] = father[father[j][i - 1]][i - 1];  
}
int lca(int x, int y){
if (depth[x] != depth[y]){
if (depth[x] > depth[y])
swap(x, y);
int distant = depth[y] - depth[x];
for (int i = 0; i < M; i++){
if (distant&(1 << i))
y = father[y][i];
}
}
if (x == y)
return x;
for (int i = M; i >= 0; i--){
if (father[x][i] != father[y][i]){
x = father[x][i];
y = father[y][i];
}
}
return father[x][0];
}
int query(int x, int y){
return dis[x] + dis[y] - (dis[lca(x, y)] << 1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: