E33 树形DP 树的直径
视频链接:E33 树形DP 树的直径_哔哩哔哩_bilibili
#include <cstring> #include <iostream> #include <algorithm> #include <vector> using namespace std; const int N=100010; int n,ans; int d1[N],d2[N]; struct edge{int v,w;}; vector<edge> e[N]; void dfs(int u,int fa){ d1[u]=d2[u]=0; for(auto i:e[u]){ int v=i.v,w=i.w; if(v==fa) continue; dfs(v,u); int t=d1[v]+w; if(t>d1[u]) d2[u]=d1[u],d1[u]=t; else if(t>d2[u]) d2[u]=t; } ans=max(ans,d1[u]+d2[u]); } int main(){ cin>>n; for(int i=1,a,b,c;i<n;i++){ cin>>a>>b>>c; e[a].push_back({b,c}); e[b].push_back({a,c}); } dfs(1,-1); cout<<ans; }
#include <cstring> #include <iostream> #include <algorithm> #include <vector> using namespace std; const int N=100010; int n,ans; struct edge{int v,w;}; vector<edge> e[N]; int dfs(int u,int fa){ int d1=0,d2=0,d; for(auto i:e[u]){ int v=i.v,w=i.w; if(v==fa) continue; d=dfs(v,u)+w; if(d>d1) d2=d1,d1=d; else if(d>d2) d2=d; } ans=max(ans,d1+d2); return d1; } int main(){ cin>>n; for(int i=1,a,b,c;i<n;i++){ cin>>a>>b>>c; e[a].push_back({b,c}); e[b].push_back({a,c}); } dfs(1,-1); cout<<ans; }
#include <cstring> #include <iostream> #include <algorithm> #include <vector> using namespace std; const int N=100010; int n,a,b,ans; int d[N]; struct edge{int v,w;}; vector<edge> e[N]; void dfs(int u,int fa){ for(auto i:e[u]){ int v=i.v,w=i.w; if(v==fa) continue; dfs(v,u); ans=max(ans,d[u]+d[v]+w); d[u]=max(d[u],d[v]+w); } } int main(){ cin>>n; for(int i=1,a,b,c;i<n;i++){ cin>>a>>b>>c; e[a].push_back({b,c}); e[b].push_back({a,c}); } dfs(1,-1); cout<<ans; }
练习:
B4016 树的直径 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
PT07Z - Longest path in a tree - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战