D47 树的直径 B4016 树的直径
视频链接:D47 树的直径 B4016 树的直径_哔哩哔哩_bilibili
B4016 树的直径 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
// 两次DFS O(n) #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N=100005; struct edge{ int to,w,ne; }e[N<<1]; int head[N],idx; void add(int x,int y,int w){ e[++idx]={y,w,head[x]}; head[x]=idx; } int n,p,d[N],mxd; void dfs(int x,int fa){ for(int i=head[x];i;i=e[i].ne){ int y=e[i].to,w=e[i].w; if(y==fa) continue; d[y]=d[x]+w; if(d[y]>mxd) mxd=d[y],p=y; dfs(y,x); } } int main(){ scanf("%d",&n); for(int i=1,x,y;i<n;i++){ scanf("%d%d",&x,&y); add(x,y,1); add(y,x,1); } dfs(1,0); d[p]=mxd=0; dfs(p,0); printf("%d\n",mxd); }
// 两次DFS O(n) #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N=100005; struct edge{ int to,w,ne; }e[N<<1]; int head[N],idx; void add(int x,int y,int w){ e[++idx]={y,w,head[x]}; head[x]=idx; } int n,p,d[N]; void dfs(int x,int ff){ if(d[x]>d[p]) p=x; for(int i=head[x];i;i=e[i].ne){ int y=e[i].to,w=e[i].w; if(y==ff) continue; d[y]=d[x]+w; dfs(y,x); } } int main(){ scanf("%d",&n); for(int i=1,x,y;i<n;i++){ scanf("%d%d",&x,&y); add(x,y,1); add(y,x,1); } dfs(1,0); d[p]=0; dfs(p,0); printf("%d\n",d[p]); }
// 树形 DP O(n) #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N=100005; struct edge{ int to,w,ne; }e[N<<1]; int head[N],idx; void add(int x,int y,int w){ e[++idx]={y,w,head[x]}; head[x]=idx; } int n,d[N],mxd; void dfs(int x,int fa){ for(int i=head[x];i;i=e[i].ne){ int y=e[i].to,w=e[i].w; if(y==fa) continue; dfs(y,x); mxd=max(mxd,d[x]+d[y]+w); d[x]=max(d[x],d[y]+w); } } int main(){ scanf("%d",&n); for(int i=1,x,y;i<n;i++){ scanf("%d%d",&x,&y); add(x,y,1); add(y,x,1); } dfs(1,0); printf("%d\n",mxd); }