树的直径(树形dp)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int maxn=102;
struct edge{ int to,point,v;};
edge e[maxn];
bool used[maxn];
int f[maxn],ans,n,cnt;
void add(int u1,int v1){e[++cnt].to=e[u1].point;e[u1].point=cnt;e[cnt].v=v1;}
void adds(int u1,int v1){ add(u1,v1);add(v1,u1);}
void init(){
int u1,v1;
cnt=0;
scanf("%d",&n);
for (int i=1;i<n;i++){ scanf("%d%d",&u1,&v1);
 adds(u1,v1);
}
memset(f,0,sizeof(f));
memset(used,0,sizeof(used));
ans=0;
}


void dfs(int x){
    int maxi1=-1,maxi2=-1;
    used[x]=1;
for (int p=e[x].point;p;p=e[p].to)
 if (!used[e[p].v])
{   dfs(e[p].v);
   f[x]=max(f[x],f[e[p].v]+1);
if (f[e[p].v]>maxi1) { maxi2=maxi1; maxi1=f[e[p].v];}
else if (f[e[p].v]>maxi2) maxi2=f[e[p].v];
}
if (maxi2>=0) ans=max(ans,maxi1+maxi2+2);
else ans=max(ans,maxi1+1);
}


int main(){
init();
dfs(1);
cout<<ans;
return 0;
}

你可能感兴趣的:(树的直径(树形dp))