樹的直徑,即這棵樹中距離最遠的兩個結點的距離。每兩個相鄰的結點的距離為1,即父親結點與兒子結點或兒子結點與父子結點之間的距離為1.有趣的是,從樹的任意乙個結點a出發,走到距離最遠的結點b,再從結點b出發,能夠走的最遠距離,就是樹的直徑。樹中相鄰兩個結點的距離為1。你的任務是:給定一棵樹,求這棵樹中距離最遠的兩個結點的距離。
輸入共n行
第一行是乙個正整數n,表示這棵樹的結點數
接下來的n-1行,每行三個正整數a,b,w。表示結點a和結點b之間有一條邊,長度為w
資料保證一定是一棵樹,不必判錯。
輸出共一行
第一行僅乙個數,表示這棵樹的最遠距離
41 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#includeusing
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 ...