标签:
链接:http://hihocoder.com/problemset/problem/1224
//深搜一遍求最大深度,从最大深度的叶子回溯到根的所经过的每个顶点在深搜求最大深度
#include <iostream> #include <math.h> #include <stdio.h> #include <queue> #include <string.h> #include <algorithm> using namespace std; const int maxn=100000+10; struct Node { int v,next; }Edge[maxn]; struct node { int start,step; }p[maxn]; int head[maxn],vis[maxn],length[maxn],pre[maxn],temp,ldeepv; void add(int u,int v,int index) { Edge[index].v=v; Edge[index].next=head[u]; head[u]=index; } void dfs(int v,int length) //求最大深度 { if(temp<length) { temp=length; ldeepv=v; } if(vis[v]) return; vis[v]=1; for(int i=head[v];i!=-1;i=Edge[i].next) { if(!vis[Edge[i].v]) dfs(Edge[i].v,length+1); } } int main() { int n; while(~scanf("%d",&n)) { int a,b,cnt=0; memset(head,-1,sizeof(head)); memset(length,0,sizeof(length)); memset(pre,0,sizeof(pre)); for(int i=1;i<n;i++) { scanf("%d%d",&a,&b); add(a,b,i); pre[b]=a; } ldeepv=temp=0; dfs(1,0); length[cnt++]=temp; //存入length // printf("%d\n",temp); int k=ldeepv; memset(vis,0,sizeof(vis)); while(pre[k]!=0) //回溯 { vis[k]=1; k=pre[k]; temp=0; dfs(k,0); length[cnt++]=temp; } sort(length,length+cnt); printf("%d\n",length[cnt-1]+length[cnt-2]); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/a73265/article/details/48136013