P4408 NOI2003 樹的直徑

2021-10-21 20:15:59 字數 1901 閱讀 1097

題意

傳送門 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遍,坑殺了我一節半課的時間。那麼,轉到正題,思路是怎麼樣的呢?首先可見這個圖是一棵...