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

2021-06-20 13:02:46 字數 997 閱讀 3195

題意:給出一棵樹,求兩節點的的距離

解題思路:

直接bfs超時,所以要使用lca(離線tarjan演算法)。

例如求x,y節點的距離,那麼先求出x,y的lca是u節點,那麼結果就是dis[x]+dis[y]-2*dis[u]

#include#include#include#include#include#include#include#include#include#include#include#include#define ll __int64

using namespace std;

#define n 40005

vectortree[n];//圖的鄰接表

vector>q[n];//詢問

int ans[n];//儲存每個詢問的結果

int f[n];

int dis[n];//dis[i]是root到i節點的距離

int find(int x)//找父根節點

return f[x];

}void mark(int a,int b)

void lca(int u)

}int flag[n];

int bfs_getpoint()//對無向圖進行bfs,從而獲取樹的乙個端點

int get=bfs_getpoint();//找無向圖形成的樹的根節點

bfs_caldis(get);//形成樹的有向圖(父結點->子節點)

pairp;

vector>record;

record.clear();

for(i=1;i<=q;i++)

calllca(get);

for(i=1;i<=q;i++)

else

} }}

/*input:

13 2

1 2 10

3 1 15

1 22 3

output:

1025

*/

HDU2586 LCA樹上倍增模板)

題意 給你一棵樹樹上任意兩節點有且僅有一條路徑可以到達,問求任意兩節點間的距離 題解 lca樹上倍增 o include include include include include include includeusing namespace std define clr a,b memset ...

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板子題,求倆個點最短距...

Hdu 2586 學習 LCA 的 ST 表做法

還是hdu 2586 求一棵樹中任意兩點間距離,學習 st 表。st 表是求區間最值的一種預處理 o nlogn 查詢 o 1 的動態規劃。例如長度為8的序列,12 5 3 20 9 7 4 1 用 dp i j 代表從第 i 個開始 包括第 i 個 往後走 2 j 步,所涵蓋的區間的最值。拿最小值...