HDU 2586 LCA求兩點最短距離

2021-10-01 21:07:59 字數 1109 閱讀 4705

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

//樹上兩點最短路徑:從根節點出發dis[u]+dis[v]-dis[lca]*2

const

int maxn=

1e5+5;

struct node

road[maxn*2]

;int n,q,cnt;

int pre[maxn][32

],head[maxn]

,depth[maxn]

;int dis[maxn]

;void

add(

int u,

int v,

int w)

void

dfs(

int u,

int fa)}}

intlca

(int u,

int v)

int i=-1

,j;while((

1<<

(i+1))

<=depth[u]

) i++

;for

(j=i;j>=

0;j--)}

if(u==v)

return u;

for(

int j=i;j>=

0;j--)}

return pre[u][0

];}int

main()

dis[1]

=0;dfs(1

,0);

while

(q--)}

}

HDU2586 LCA樹上倍增模板)

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

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

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

求球面兩點最短距離

problem 給定球的半徑,兩點的經緯度,求這兩點間的最短距離。solution 球面兩點間距離公式 r acos cos wa cos wb cos jb ja sin wa sin wb r代表半徑,wa是a點的緯度,wb是b點的緯度,ja是a點的經度,jb是b點的經度,去北緯為正,東經為正。...