洛谷P4408 逃學的小孩 樹的直徑

2021-09-02 07:23:04 字數 1663 閱讀 5023

給出一棵樹,已知有人一開始在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

[c][

a],d

is[c

][b]

))那麼為了使答案最大,那麼肯定先滿足dis

[a][

b]

dis[a][b]

dis[a]

[b]盡量大,那麼肯定就是求樹的直徑。那麼假設求出的樹的直徑的兩個端點是p

pp和q

qq,那麼很明顯可以暴力求出每個點到p

pp和到q

qq的較小值,然後取個max

maxma

x即可。

時間複雜度:o(n

)o(n)

o(n)

//dfs1和dfs2是求直徑的兩個端點p和q以及直徑長度

//dfs3和dfs4是求每個點到p的距離和到q的距離

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n=

200100

;int n,m,x,y,z,tot,p,q,head[n]

;ll ans,sum,dis[n]

;struct edge

e[n*2]

;void

add(

int from,

int to,

int dis)

void

dfs1

(int x,

int fa,ll s)

}void

dfs2

(int x,

int fa,ll s)

}void

dfs3

(int x,

int fa,ll s)

}void

dfs4

(int x,

int fa,ll s)

}int

main()

dfs1(1

,0,0

);dfs2

(p,0,0

);dfs3

(p,0,0

);dfs4

(q,0,0

);sum=0;

for(

int i=

1;i<=n;i++

) sum=

max(sum,dis[i]);

//求最大值

printf

("%lld\n"

,sum+ans)

;//直徑+最大值

return0;

}

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

NOI2003 逃學的小孩(樹的直徑)

chris家的 鈴響起了,裡面傳出了chris的老師焦急的聲音 喂,是chris的家長嗎?你們的孩子又沒來上課,不想參加考試了嗎?一聽說要考試,chris的父母就心急如焚,他們決定在盡量短的時間內找到chris。他們告訴chris的老師 根據以往的經驗,chris現在必然躲在朋友shermie或ya...