題面傳送門
先兩遍dfs
dfsdf
s跑出樹的直徑。
因為所有樹的直徑都是相類似的,所以只要跑一條直徑就好了。
然後在這條直徑上尺取。
最後對於直徑上每個點的子樹不經過直徑上的邊求距離取最大值即可,這一步很難想,因為如果不取最大值那麼就會漏掉答案因為無論如何都是要有這條邊的權值的。
完美o (n
)o(n)
o(n)
**實現:
#include
#include
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using
namespace std;
int n,m,k,x,y,z,r,now,cur,pus,maxn,d[
1000039
],ans=
1e9,fa[
1000039
],flag[
1000039];
struct yyy
;struct ljb
; h[x]
=head;
}}s;
inline
void
dfs(
int x,
int last)
}int
main()
for(i=
1;i<=n;i++)}
for(i=
1;i<=n;i++
) ans=
max(ans,d[i]);
printf
("%d\n"
,ans)
;}
題解 Luogu P1099 樹網的核
這題資料是真的水啊。昨天模擬賽考了這題,很多人都是 o n 3 水過,但我認為,要做就做的足夠好 其實是我根本沒想到 o n 3 的做法 然後就開始想 o n 的解法。首先看題目,前面一大堆看似是廢話,其實還是有很大用處的。問題描述中提到了樹的中心,但後面卻貌似沒有用到,其實中心是給我們帶來提示的。...
BZOJ 1099 樹網的核
題面 搞了三個多小時。noip時的資料很水,直接暴力n 3過。我們考慮優化,首先可以貪心,我們要在直徑上選肯定越插長越好,所以n 2其實就可以解決。但這還不夠,根據直徑的最長性,我們可以用乙個單調佇列優化。include include include include include using n...
P1099 樹網的核
這裡是o n 2 的做法 首先可以證明,對於每一條直徑,求出的偏心距是一樣的 怎麼證明?顯然 我不會 怎樣求樹的直徑?簡單。貪心 在一條直徑上,顯然選擇的路徑越長越好 實現 首先求出樹上所有點之間的距離 n 2 一直dfs就行 然後找出直徑及直徑經過的點 最後在直徑上貪心的取即可 include i...