POJ 1985 Cow Marathon 树的直径

2014-11-24 09:05:45 · 作者: · 浏览: 1

题意:题目阐述不是很清楚,是一棵严格树,不存在环,求其中两点间距离最长一处。

思路:两点间距离最长即为树的直径。易得,从任意点开始DFS找到距离最长一点一定是距离最长两点之一,再从找到的点再DFS一次就可以找到数的直径。

代码:

#include
  
   
#include
   
     #include
    
      #include
     
       #include
       #include
       
         #include
        
          #include
         
           #include
          
            #include
           
             #include
            
              #define PI acos(-1.0) #define maxn 50005 #define maxm 100005 #define INF 1<<25 #define MAX 0x7fffffff typedef long long ll; using namespace std; struct Edge { int v,w; int next; }edge[maxm]; int tot,tt; int point[maxn]; int vv[maxn],dis[maxn]; int top=1,d; int init() { top=1; memset(edge,0,sizeof(edge)); memset(point,0,sizeof(point)); memset(vv,0,sizeof(vv)); memset(dis,0,sizeof(dis)); d=0; } int add_edge(int u,int v,int w) { edge[top].v=v; edge[top].w=w; edge[top].next=point[u]; point[u]=top++; edge[top].v=u; edge[top].w=w; edge[top].next=point[v]; point[v]=top++; return 0; } int dfs(int x) { vv[x]=1; for(int i=point[x];i!=0;i=edge[i].next) { if(!vv[edge[i].v]) { d+=edge[i].w; dis[edge[i].v]=d; dfs(edge[i].v); d-=edge[i].w; } } } int main() { scanf(%d%d,&tot,&tt); init(); for(int i=0;i
             
              aa) { bb=i; aa=dis[i]; } } memset(dis,0,sizeof(dis)); memset(vv,0,sizeof(vv)); dfs(bb); aa=0; d=0; for(int i=1;i<=tot;i++) { if(dis[i]>aa) { bb=i; aa=dis[i]; } } printf(%d ,aa); }