NOI2003 樹的直徑 逃學的小孩

2022-02-02 17:25:30 字數 2197 閱讀 3286

原題鏈結

分享題說實話最開始都沒什麼思路,之前的大部分基本都看了一下題解啟發思路。

但這道題我可以大聲而驕傲地說:它  是  我  完  完  全  全  自  己  做  出  來  的  !

當然,代價就是vjudge上wa了5遍,洛谷上wa了1遍,坑殺了我一節半課的時間。

那麼,轉到正題,思路是怎麼樣的呢?

首先可見這個圖是一棵樹,我們需要找到三個點,暫時叫abc吧。其中(a到b的距離+c到ab距離中較短的)這一值最小。

(以下maxdis代表樹的直徑,maxv代表第一遍dfs找到的直徑端點,end代表第二遍dfs找到的另乙個端點,bj i代表點是否在直徑上,ans i 以及之後的ans1 i 代表節點 i 到maxv的距離,ans2 i 代表節點 i 到end的距離,b代表最後的答案)

很顯然這屬於樹的直徑題。用兩遍dfs找出樹的兩個頂點……之後呢?我在這裡第一次卡住了。

由於萬惡的樣例帶來的錯覺,我覺得題目要求的點一定是在直徑上。所以我就用了第三遍dfs,找出來了所有直徑上的點,在第二遍dfs的時候順帶計算出ans  i,之後迴圈一遍找到答案就行。迴圈大概就是:

for(int i=1;i<=n;i++) if(bj[i]==1&&i!=end&&i!=maxv) b=max(b,min(maxdis-ans[i],ans[i]));

然後就wa了。

之後很長時間我就卡在了這個**的框框裡,因為我一直堅定地認為要求的點在直徑上。卡了半天還是感謝洛谷提供的一組錯誤樣例讓我恍然大悟:

我的c為什麼一定要在直徑上?!

下面是洛谷給的樣例:

簡潔明瞭但很有說服力。

顯然,樹的直徑是2-4或3-4。由於這兩種沒有差別下面就用2-4舉例。

如果按照之前的想法,c在直徑上,那麼我算出來的結果是4.但若我們選3作為c呢?

2到4的距離+3到2,4距離中較短的=5。

也就是說c不一定在直徑上。

噫,好了,全崩了。

但是思路正確了應該就沒什麼問題了。我們在第二遍dfs的時候順帶算出各點到maxv的距離,之後再dfs一遍算出各點到end的距離,之後把各個點遍歷一遍算min(ans1[i],ans2[i])+maxdis的最大值即可。

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8 typedef long

long

ll;9

const

int maxn=200000+3;10

intn,m,tot,head[maxn],end,maxv;

11ll maxdis,ans1[maxn],ans2[maxn];

12struct

nodee[2*maxn];

16void add(int

from,int

to,ll w)

23void dfs1(int u,int f,ll dis)

28for(int i=head[u];i;i=e[i].next)33}

34void dfs2(int u,int f,ll dis)

40for(int i=head[u];i;i=e[i].next)45}

46void dfs3(int u,int f,ll dis)53}

54int

main()

64 dfs1(1,-1,0

);65 maxdis=0

;66 dfs2(maxv,-1,0

);67 dfs3(end,-1,0

);68 ll b=-1;69

for(int i=1;i<=n;i++) if(i!=end&&i!=maxv) b=max(b,min(ans1[i],ans2[i])+maxdis);

70//

找最佳點

71 cout<

72return0;

73 }

view code

幸甚至哉,歌以詠志。

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

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

NOI2003 逃學的小孩

演算法 最短路 樹的直徑 難度 noip 注意 多年oi一場空,不開long long見祖宗!如果不開long long,應該會被卡到60分!注意 dfs找樹的直徑時,傳的引數 d 也要開long long哦!首先,因為無論如何答案都會包括a到b的dis,所以我們先用2遍dfs找到dis a b 的...

NOI2003 逃學的小孩

傳送門 here 題意 給出一棵樹 帶權 要從乙個節點c先走到距離它近的乙個節點b,再走到a,要求最壞情況下的總路程 即最長 解題思路 乍一看,a,b,c都沒給出,這怎麼求?不妨設距離c較近的點位a。分析發現,無論怎樣,a b是一定要走的。那麼如何能讓樹上任意兩點間距離最大呢?不難發現a,b就是該樹...