E33 树形DP 树的直径
视频链接:E33 树形DP 树的直径_哔哩哔哩_bilibili
B4016 树的直径 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
PT07Z - Longest path in a tree - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include <cstring> #include <iostream> #include <algorithm> #include <vector> using namespace std; const int N=100010; int n,a,b,c,ans; struct edge{int y,w;}; vector<edge> e[N]; int dfs(int x,int fa){ int d1=0,d2=0,d; for(auto i:e[x]){ int y=i.y,w=i.w; if(y==fa) continue; d=dfs(y,x)+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;i<n;i++){ cin>>a>>b; e[a].push_back({b,1}); e[b].push_back({a,1}); } 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 d1[N],d2[N]; vector<int> e[N]; void dfs(int x,int fa){ d1[x]=d2[x]=0; for(int y:e[x]){ if(y==fa) continue; dfs(y,x); int t=d1[y]+1; if(t>d1[x]) d2[x]=d1[x],d1[x]=t; else if(t>d2[x]) d2[x]=t; } ans=max(ans,d1[x]+d2[x]); } int main(){ cin>>n; for(int i=1;i<n;i++){ cin>>a>>b; e[a].push_back(b); e[b].push_back(a); } 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]; vector<int> e[N]; void dfs(int x,int fa){ for(int y:e[x]){ if(y==fa) continue; dfs(y,x); ans=max(ans,d[x]+d[y]+1); d[x]=max(d[x],d[y]+1); } } int main(){ cin>>n; for(int i=1;i<n;i++){ cin>>a>>b; e[a].push_back(b); e[b].push_back(a); } dfs(1,-1); cout<<ans; }