題目描述
n
nn個點n−1
n-1n−
1條邊,點之間兩兩連通,每次詢問3
33個點,求使這3
33個點連通的最小花費。(1≤n
,q≤1
05
1\leq n,q\leq 10^5
1≤n,q≤
105)
因為給的是一顆樹,最終的答案就是dis
t(x,
y)+d
ist(
y,z)
+dis
t(x,
z)2.
\frac.
2dist(
x,y)
+dis
t(y,
z)+d
ist(
x,z)
.倍增求lca即可。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define mem(a, x) memset(a,x,sizeof(a))
#define iosup ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using
namespace std;
const
int n =
1e5+10;
int fa[n][1
<<5]
;int n, q, dep[n]
;ll dis[n]
;struct edge
;vector g[n]
;void
dfs(
int u,
int father)
}inline
void
init()
);g[v]
.push_back
(edge);
} dis[1]
= dep[1]
=0;dfs(1
,0);
}int
lca(
int u,
int v)
if(u==v)
return u;
for(
int i=
20;i>=
0;i--)}
return fa[u][0
];}ll d
(int u,
int v)
intmain()
return0;
}
倍增LCA複習
時間過去了如此之久,我連倍增lca都不怎麼記得了,要粗事啊。首先預處理層數和每個節點的父親,然後預處理p陣列,p i,j 表示i向上第2 j個祖先。最後對於每個詢問x,y先把x,y變成同一層數的 x或y向上走直到兩個層數相等 然後x,y同時向上走,直到x和y的父親相同位置。自 1.dfs預處理出所有...
倍增LCA模板
注意!本篇題解不適合初學lca的同學學習,因為我講的很爛很不清楚。倍增,顧名思義,就是成倍增加的意思。我們知道,任何乙個數字都可以表示成二進位制。那麼對於一條長度為n的鏈,我們總是可以跳大概logn次到達最後。對於鏈上任意一點,我們都可以在大概logn的複雜度下詢問到,其實倍增的思路就是二分,和快速...
LCA倍增講解
這道題值得一刷 題解裡的巨佬都用tarjan 窩太難了 實際上是他們太巨了 本人 馬蜂 碼風獨特,請見諒 include include include include using namespace std inline intread while ch 0 ch 9 return x f inl...