zoukankan      html  css  js  c++  java
  • 求树的直径

    // 我们将一棵树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;
    }
  • 相关阅读:
    csrf跨站请求伪造
    IO 之 InputStream 和 Reader
    javadoc tags
    java this
    递归
    java 文件中 定义一个字符串,它的默认编码是什么?
    合并数组
    << 移位运算
    final static T
    Base64.java 工具类
  • 原文地址:https://www.cnblogs.com/MorrowWind/p/13056524.html
Copyright © 2011-2022 走看看