題意:給出一棵樹,求兩節點的的距離
解題思路:
直接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 步,所涵蓋的區間的最值。拿最小值...