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

2022-09-03 04:09:10 字數 1552 閱讀 9905

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

b]di

s[a]

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

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

p和到q

q的較小值,然後取個max

max即可。

時間複雜度: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 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...

NOI2003 樹的直徑 逃學的小孩

原題鏈結 分享題說實話最開始都沒什麼思路,之前的大部分基本都看了一下題解啟發思路。但這道題我可以大聲而驕傲地說 它 是 我 完 完 全 全 自 己 做 出 來 的 當然,代價就是vjudge上wa了5遍,洛谷上wa了1遍,坑殺了我一節半課的時間。那麼,轉到正題,思路是怎麼樣的呢?首先可見這個圖是一棵...

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

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