HDU2586 LCA樹上倍增模板)

2021-09-02 15:29:24 字數 940 閱讀 4133

題意:給你一棵樹樹上任意兩節點有且僅有一條路徑可以到達,問求任意兩節點間的距離

題解:lca樹上倍增

o#include#include#include#include#include#include#includeusing namespace std;

#define clr(a,b) memset(a,b,sizeof(a))

#define il inline

typedef long long ll;

const int maxn = 40000 + 2;

const int minn = 130 + 1;

struct edge

edge(){}

};vectorgraph[maxn];

int n,m;

int deep[maxn],dis[maxn],fa[maxn][30];

il void add(int a,int b,int dis)

il void dfs(int v)//dfs求每一子節點到根節點的距離存放到dis陣列

//進行樹上倍增fa[v][i]代表v向上2^i層的父節點

for(auto i:graph[v])

dis[i.to]=dis[v]+i.len;

fa[i.to][0]=v;

dfs(i.to);

}return ;

}il int lca(int a,int b)

}if(a==b)return a;

for(i=20;i>=0;--i)//求a,b的公共節點

}return fa[a][0];

}il void init()

int main()

dfs(1);

while(m--)

}return 0;

}

hdu2586 LCA應用 求樹的任意兩節點的距離

題意 給出一棵樹,求兩節點的的距離 解題思路 直接bfs超時,所以要使用lca 離線tarjan演算法 例如求x,y節點的距離,那麼先求出x,y的lca是u節點,那麼結果就是dis x dis y 2 dis u include include include include include inc...

HDU 2586 LCA求兩點最短距離

hdu 2586 題解 求樹上兩點最短距離,利用lca u,v 求出u,v最近公共祖先la,並記錄根節點到u,v,la的距離,最短距離 dis u dis v 2 dis la ac include include include using namespace std lca板子題,求倆個點最短距...

樹上倍增法求LCA

我們找的是任意兩個結點的最近公共祖先,那麼我們可以考慮這麼兩種種情況 1.兩結點的深度相同.2.兩結點深度不同.第一步都要轉化為情況1,這種可處理的情況。先不考慮其他,我們思考這麼乙個問題 對於兩個深度不同的結點,把深度更深的那個向其父節點迭代,直到這個迭代結點和另乙個結點深度相同,那麼這兩個深度相...