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;
    }
  • 相关阅读:
    MVP模式与MVVM模式
    webpack的配置处理
    leetcode 287 Find the Duplicate Number
    leetcode 152 Maximum Product Subarray
    leetcode 76 Minimum Window Substring
    感知器算法初探
    leetcode 179 Largest Number
    leetcode 33 Search in Rotated Sorted Array
    leetcode 334 Increasing Triplet Subsequence
    朴素贝叶斯分类器初探
  • 原文地址:https://www.cnblogs.com/MorrowWind/p/13056524.html
Copyright © 2011-2022 走看看