題意
傳送門 p4408 [noi2003] 逃學的小孩
題解設路徑 (c,
a)
(c,a)
(c,a
) 與路徑 (a,
b)
(a,b)
(a,b
) 的第乙個交點為 d
dd,問題等價於從 a
aa 出發,找到兩條路徑 (a,
b),(
a,c)
(a,b),(a,c)
(a,b),
(a,c
) 且滿足 dis
t(a,
d)≤d
ist(
d,b)
dist(a,d)\leq dist(d,b)
dist(a
,d)≤
dist
(d,b
),使 dis
t(a,
b)+d
ist(
a,c)
dist(a,b)+dist(a,c)
dist(a
,b)+
dist
(a,c
) 最大。設 a,b
a,ba,
b 為某條路徑的端點,則答案為 dis
t(a,
b)+d
ist(
c,d)
+min[
dist
(a,d
),di
st(d
,b)]
,d∈p
ath(
a,b)
dist(a,b)+dist(c,d)+\min[dist(a,d),dist(d,b)],d\in path(a,b)
dist(a
,b)+
dist
(c,d
)+min[di
st(a
,d),
dist
(d,b
)],d
∈pat
h(a,
b)設 (a,
d)
(a,d)
(a,d
) 或 (d,
b)
(d,b)
(d,b
) 為樹的直徑的分叉的一部分,根據直徑的最長性,將其替換為樹的直徑不會使答案更差。那麼 dfs
dfsdf
s 求解某條樹的直徑,再次 dfs
dfsdf
s 求解直徑上各點到其子樹節點的最遠距離,列舉路徑上的點更新答案即可。總時間複雜度 o(n
)o(n)
o(n)
。
#include
using
namespace std;
typedef
long
long ll;
const
int maxn =
200005
;int n, m, pre[maxn]
, num, rec[maxn]
;int tot, head[maxn]
, to[maxn <<1]
, cost[maxn <<1]
, nxt[maxn <<1]
;ll mx[maxn]
, ds[maxn]
;bool in[maxn]
;inline
void
add(
int x,
int y,
int z)
void
dfs(
int x,
int f, ll w,
int&t)
}void
dfs2
(int x,
int f, ll w)
}int
main()
洛谷P4408 逃學的小孩 樹的直徑
給出一棵樹,已知有人一開始在c cc點,要到達a aa點和b bb點 那個近先去哪 求最壞的情況所需的時間。轉化題意 求 ma x di s a b min dis c a di s c b 求max dis a b min dis c a dis c b 求max d is a b min dis...
洛谷P4408 逃學的小孩 樹的直徑
給出一棵樹,已知有人一開始在c c點,要到達a a點和b b點 那個近先去哪 求最壞的情況所需的時間。轉化題意 求m ax d is a b min dis c a d is c b 求m ax d is a b min dis c a d is c b 那麼為了使答案最大,那麼肯定先滿足dis a...
NOI2003 樹的直徑 逃學的小孩
原題鏈結 分享題說實話最開始都沒什麼思路,之前的大部分基本都看了一下題解啟發思路。但這道題我可以大聲而驕傲地說 它 是 我 完 完 全 全 自 己 做 出 來 的 當然,代價就是vjudge上wa了5遍,洛谷上wa了1遍,坑殺了我一節半課的時間。那麼,轉到正題,思路是怎麼樣的呢?首先可見這個圖是一棵...