Tyvj P1520 樹的直徑

2022-04-02 07:23:13 字數 1092 閱讀 4328

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

輸入共n行

第一行是乙個正整數n,表示這棵樹的結點數

接下來的n-1行,每行三個正整數a,b,w。表示結點a和結點b之間有一條邊,長度為w

資料保證一定是一棵樹,不必判錯。

輸出共一行

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

1 2 10 

1 3 12 

1 4 15

27

10%的資料滿足1<=n<=5

40%的資料滿足1<=n<=100

100%的資料滿足1<=n<=10000 1<=a,b<=n 1<=w<=10000tgotmacp

隨便找個根. 先從下往上, 求出每個點到子樹中最遠和次遠點的距離.(遞迴過程中)

然後再從上往下, 看從上面接下來的路徑能有多長.(遞迴返回時)

直接把每個點的最長和次長加起來.

#include#include

using

namespace

std;

int dp[10010][3],n,head[10010

],num,ans;

struct

nodee[

20010

];void insert(int

from,int to,int

v)void dfs(int f,int

pre)

else dp[f][0]=max(dp[f][0],dp[v][1]+e[i].v);

}ans=max(ans,dp[f][1]+dp[f][0

]);}

intmain()

dfs(

1,0);

printf("%d

",ans);

}

SDOI2013 直徑(樹的直徑)

小q最近學習了一些圖論知識。根據課本,有如下定義。樹 無迴路且連通的無向圖,每條邊都有正整數的權值來表示其長度。如果一棵樹有n個節點,可以證明其有且僅有n 1 條邊。路徑 一棵樹上,任意兩個節點之間最多有一條簡單路徑。我們用 dis a,b 表示點a和點b的路徑上各邊長度之和。稱dis a,b 為a...

樹的直徑 板子

不帶解釋版模板o n 常數較大,但是可以知道樹上每一點到直徑端點的距離,這個大多時候都很有用 struct node e maxn 2 ll dis1 maxn dis2 maxn int st,ed,max len void dd int u,int fa,int len,int flag fil...

樹的直徑相關

一.樹直徑的定義.顯然一棵樹可以有不止一條直徑.二.樹直徑的求解.一般來說樹的直徑可以用樹形dp來求.設f i 0 1 f i 0 1 f i 0 1 表示在i ii的子樹中以i ii為一端的最長 次長鏈長度,我們可以很容易dp出來這個值,樹的直徑就是f i 0 f i 1 f i 0 f i 1 ...