zoukankan      html  css  js  c++  java
  • tyvj4865 天天和树tree

    #include<bits/stdc++.h>
    #define MAXN 100000+10
    using namespace std;
    struct ed{int v,next;}edge[2*MAXN];
    int n,far1,far2,maxlen,ans=0,head[MAXN],pre[MAXN],d[MAXN];
    bool is[MAXN],vis[MAXN];
    void add(int u,int v){
        static int tot=0;
        edge[++tot].v=v;
        edge[tot].next=head[u];
        head[u]=tot;
    }
    void dfs1(int u,int fa,int len){
        if(len>maxlen){maxlen=len;far1=u;}
        for(int i=head[u];i;i=edge[i].next){
            int v=edge[i].v;
            if(v!=fa)dfs1(v,u,len+1);
        }
    }
    void dfs2(int u,int fa,int len){
        pre[u]=fa;
        if(len>maxlen){maxlen=len;far2=u;}
        for(int i=head[u];i;i=edge[i].next){
            int v=edge[i].v;
            if(v!=fa)dfs2(v,u,len+1);
        }
    }
    void dfs3(int u,int fa,int dis){
        d[u]=dis;
        for(int i=head[u];i;i=edge[i].next){
            int v=edge[i].v;
            if(v!=fa)dfs3(v,u,dis+1);
        }
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<n;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            add(u,v);add(v,u);
        }
        maxlen=0;
        dfs1(1,1,1);
        maxlen=0;
        dfs2(far1,far1,1);
        is[far1]=1;
        for(int i=far2;i!=pre[i];i=pre[i])is[i]=1;
        for(int u=1;u<=n;u++)
            if(is[u]){
                for(int i=head[u];i;i=edge[i].next){
                    int v=edge[i].v;
                    if(!is[v])dfs3(v,u,1);
                }
            }    
        for(int i=1;i<=n;i++)
            if(!is[i])ans=max(ans,d[i]);
        printf("%d",ans);        
        return 0;
    }

    找直径即可,正确性显然(嘿嘿嘿。。。)

     其实反证法很容易搞定。。。。

    Hello World
  • 相关阅读:
    CCNode作为容器实现显示区域剪裁
    使用CCNode作为容器容易踩的坑
    走了很多弯路的CCScrollView
    常用es6特性归纳-(一般用这些就够了)
    WebP图片优化
    es6 Promise 异步函数调用
    网站性能优化
    dom元素分屏加载
    js顺序加载与并行加载
    移动端真机调试
  • 原文地址:https://www.cnblogs.com/NINGLONG/p/7554531.html
Copyright © 2011-2022 走看看