HDU 2586 How far away ?(LCA裸题)
Posted xorxor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 2586 How far away ?(LCA裸题)相关的知识,希望对你有一定的参考价值。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586
#include<bits/stdc++.h> #define lson rt << 1, l, m #define rson rt << 1 | 1, m + 1, r using namespace std; typedef long long ll; static const ll inf = (1 << 32); static const int INF = 0x3f3f3f3f; static const int MAX_N = 4e4 + 5; static const int N = 5005; struct Edge int to, dis; Edge(int _to, int _dis)to = _to; dis = _dis; ; int n; vector<Edge>edge[MAX_N]; int fa[MAX_N], dep[MAX_N], dis[MAX_N]; int par[MAX_N][30]; void dfs(int u, int pre, int depth) fa[u] = pre; dep[u] = depth; int le = edge[u].size(); for(int i = 0; i < le; ++i) int v = edge[u][i].to; if(v == pre) continue; dis[v] = dis[u] + edge[u][i].dis; dfs(v, u, depth + 1); void init_LCA() for(int j = 0; (1 << j) <= n; ++j) for(int i = 1; i <= n; ++i) par[i][j] = -1; for(int i = 1; i <= n; ++i) par[i][0] = fa[i]; for(int j = 1; (1 << j) <= n; ++j) for(int i = 1; i <= n; ++i) if(par[i][j - 1] != -1) par[i][j] = par[par[i][j - 1]][j - 1]; int LCA(int x, int y) if(dep[x] < dep[y]) swap(x, y); int lg; for(lg = 0; (1 << lg) <= dep[x]; ++lg); --lg; for(int i = lg; i >= 0; --i) if(dep[x] - (1 << i) >= dep[y]) x = par[x][i]; if(x == y) return x; for(int i = lg; i >= 0; --i) if(par[x][i] != -1 && par[x][i] != par[y][i]) x = par[x][i], y = par[y][i]; return fa[x]; void addEdge(int u, int v, int w) edge[u].push_back(Edge(v, w)); int main() // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); int t, m; scanf("%d", &t); while(t--) scanf("%d%d", &n, &m); for(int i = 1; i <= n; ++i) edge[i].clear(); for(int i = 1; i < n; ++i) int u, v, w; scanf("%d%d%d", &u, &v, &w); addEdge(u, v, w); addEdge(v, u, w); dis[1] = 0; dfs(1, -1, 0); init_LCA(); while(m--) int u, v; scanf("%d%d", &u, &v); printf("%d\n", dis[u] + dis[v] - 2 * dis[LCA(u, v)]); return 0;
以上是关于HDU 2586 How far away ?(LCA裸题)的主要内容,如果未能解决你的问题,请参考以下文章
HDU - 2586 How far away ?(暴力 | LCA)