2334 樹的直徑(樹形DP)

2021-09-25 17:57:03 字數 1318 閱讀 1373

原博主部落格(還有廣搜的寫法) 描述

樹的直徑,即這棵樹中距離最遠的兩個結點的距離。每兩個相鄰的結點的距離為1,即父親結點與兒子結點或兒子結點與父子結點之間的距離為1.有趣的是,從樹的任意乙個結點a出發,走到距離最遠的結點b,再從結點b出發,能夠走的最遠距離,就是樹的直徑。樹中相鄰兩個結點的距離為1。你的任務是:給定一棵樹,求這棵樹中距離最遠的兩個結點的距離。

輸入輸入共n行 第一行是乙個正整數n,表示這棵樹的結點數 接下來的n-1行,每行三個正整數a,b,w。表示結點a和結點b之間有一條邊,長度為w 資料保證一定是一棵樹,不必判錯。

輸出輸出共一行 第一行僅乙個數,表示這棵樹的最遠距離

樣例輸入

4

1 2 10

1 3 12

1 4 15

樣例輸出
27
提示 解析

看一眼,是最長路,差點沒甩乙個spfa走人

在網上看了一些題解,想法總結一下:

code

#include

。using

namespace std;

const

int n=

1e4+5;

intread()

while

(isdigit

(ch)

)return s*f;

}struct fjye[n<<1]

;int fir[n]

,f[n][3

];int ans,n,u,v,cnt,w;

void

add(

int ui,

int vi,

int wi)

voiddp(

int u,

int fa)

else

if(f[u][2

].v][1]

+e[i]

.w) f[u][2

]=f[e[i]

.v][1]

+e[i]

.w;//,printf("->2->1:f2=%d,v=%d;\n",f[u][2]);else printf("->2->2:f2=%d,v=%d;\n",f[u][2]);}if

(ans]+f[u][2

]) ans=f[u][1

]+f[u][2

];}int

main()

//printf("w=%d\n",e[fir[1]].w);dp(

1,0)

;printf

("%d"

,ans)

;return0;

}

樹形dp 求樹的直徑

隨著杭州西湖的知名度的進一步提公升,園林規劃專家湫湫希望設計出一條新的經典觀光線路,根據老闆馬小騰的指示,新的風景線最好能建成環形,如果沒有條件建成環形,那就建的越長越好。現在已經勘探確定了n個位置可以用來建設,在它們之間也勘探確定了m條可以設計的路線以及他們的長度。請問是否能夠建成環形的風景線?如...

hdu 4607 樹形dp 樹的直徑

題目大意 給你n個點,n 1條邊,將圖連成一棵生成樹,問你從任意點為起點,走k k n 個點,至少需要走多少距離 每條邊的距離是1 思路 樹形dp求樹的直徑r a 若k r 1 ans k 1 b 若k r 1,ans r k r 1 2 include include includeusing n...

hdoj2196(樹形dp,樹的直徑)

題意 給出一棵樹,求每個結點可以到達的最遠距離。思路 如果求得是樹上最長距離,兩次bfs就行。但這裡求的是所有點的最遠距離,樹形dp的經典題,想了乙個小時,還是dp做得太少。分析可得對任意結點u,它的最長距離要麼是向下延伸的最長距離,要不向上延伸的最長距離。我們用dp u 0 表示節點u向下 子結點...