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;
View Code

 

以上是关于HDU 2586 How far away ?(LCA裸题)的主要内容,如果未能解决你的问题,请参考以下文章

HDU - 2586 How far away ?(暴力 | LCA)

hdu 2586 How far away ?

HDU 2586 How far away ?

HDU2586---How far away ?(lca算法)

HDU-2586 How far away?

HDU-2586 How far away?