倍增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); }
相关文章推荐
- 洛谷.4180.[模板]次小生成树Tree(Kruskal LCA 倍增)
- 【LCA倍增模板】【poj1330】最近公共祖先
- hdu2586 倍增lca模板
- 模板 树上求LCA 倍增和树链剖分
- LCA之倍增算法模板
- 洛谷P3379 模板LCA(倍增)
- 【LCA】倍增模板
- 倍增LCA模板
- 倍增LCA 模板
- hdu 5296 lca+dfs应用,lca倍增法模板
- LCA模板——倍增法
- 倍增求lca模板
- Hdu 2586 How far away ?【倍增LCA模板记录】
- {模板}LCA倍增
- 倍增LCA模板
- lca(最近公共祖先)倍增模板【pascal】
- 【模板】倍增LCA [2017年5月计划 清北学堂51精英班 Day3]
- 【模板】【LCA】【树上倍增】
- 倍增求lca(模板)
- czl蒟蒻的模板库6——倍增LCA