原博主部落格(還有廣搜的寫法) 描述
樹的直徑,即這棵樹中距離最遠的兩個結點的距離。每兩個相鄰的結點的距離為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向下 子結點...