求树的直径
// 我们将一棵树T = ( V,E )的直径定义为maxδ ( u,v ) ( u,v ∈ V ),也就是说,树中所有最短路径距离的最大值即为树的直径。 // 对于树的直径呢,我们老师给我们介绍了两种做法,一种是用两次bfs(或者dfs),另一种是用树形DP // 对于树的直径,两种做法,一种是用两次bfs(或者dfs),另一种是用树形DP // 两次dfs 先从任意一点P出发,找离它最远的点Q,再从点Q出发,找离它最远的点W,W到Q的距离就是是的直径 //至于树形dp,难,略 #include<bits/stdc++.h> using namespace std; const int N=20000+10; int n,ans=0,first[N],next1[N],u[N],v[N],w[N],d[N]={0},mxx=0,pt=0; void dfs1(int rt,int f,int l){ if(l>mxx){ mxx=l; pt=rt; } for(int i=first[rt];i!=-1;i=next1[i]){ if(v[i]==f) continue; dfs1(v[i],rt,l+w[i]); } } void dfs2(int rt,int f,int l){ ans=max(ans,l); for(int i=first[rt];i!=-1;i=next1[i]){ if(v[i]==f) continue; dfs2(v[i],rt,l+w[i]); } } int main() { cin>>n; memset(first,255, sizeof(first)); memset(next1,255, sizeof(next1)); for(int i=1;i<n;i++){ cin>>u[i]>>v[i]>>w[i]; next1[i]=first[u[i]]; first[u[i]]=i; u[i+n]=v[i]; v[i+n]=u[i]; w[i+n]=w[i]; next1[i+n]=first[u[i+n]]; first[u[i+n]]=i+n; } dfs1(1,-1,0); dfs2(pt,-1,0); cout<<pt<<endl; cout<<ans<<endl; return 0; }