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點的經度,去北緯為正,東經為正。...