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