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

    P1520 树的直径

    http://www.tyvj.cn/p/1520

    时间: 1000ms / 空间: 131072KiB / Java类名: Main

    描述

    树的直径,即这棵树中距离最远的两个结点的距离。每两个相邻的结点的距离为1,即父亲结点与儿子结点或儿子结点与父子结点之间的距离为1.有趣的是,从树的任意一个结点a出发,走到距离最远的结点b,再从结点b出发,能够走的最远距离,就是树的直径。树中相邻两个结点的距离为1。你的任务是:给定一棵树,求这棵树中距离最远的两个结点的距离。

    输入格式

    输入共n行
    第一行是一个正整数n,表示这棵树的结点数
    接下来的n-1行,每行三个正整数a,b,w。表示结点a和结点b之间有一条边,长度为w
    数据保证一定是一棵树,不必判错。

    输出格式

    输出共一行
    第一行仅一个数,表示这棵树的最远距离

    测试样例1

    输入


    1 2 10 
    1 3 12 
    1 4 15

    输出

    27

    备注

    10%的数据满足1<=n<=5
    40%的数据满足1<=n<=100
    100%的数据满足1<=n<=10000 1<=a,b<=n 1<=w<=10000Tgotmacp

    随便找个根. 先从下往上, 求出每个点到子树中最远和次远点的距离.(递归过程中)

    然后再从上往下, 看从上面接下来的路径能有多长.(递归返回时)

    直接把每个点的最长和次长加起来.

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int dp[10010][3],n,head[10010],num,ans;
    struct node{
        int pre,to,v;
    }e[20010];
    void Insert(int from,int to,int v){
        e[++num].to=to;
        e[num].pre=head[from];
        e[num].v=v;
        head[from]=num;
    }
    void dfs(int f,int pre){
        for(int i=head[f];i;i=e[i].pre){
            int v=e[i].to;
            if(v==pre)continue;
            dfs(v,f);
            if(dp[f][1]<dp[v][1]+e[i].v){
                dp[f][0]=dp[f][1];
                dp[f][1]=dp[v][1]+e[i].v;
            }
            else dp[f][0]=max(dp[f][0],dp[v][1]+e[i].v);
        }
        ans=max(ans,dp[f][1]+dp[f][0]);
    }
    int main(){
        scanf("%d",&n);
        int x,y,z;
        for(int i=1;i<n;i++){
            scanf("%d%d%d",&x,&y,&z);
            Insert(x,y,z);
            Insert(y,x,z);
        }
        dfs(1,0);
        printf("%d",ans);
    }
  • 相关阅读:
    自定义控件其实很简单5/12
    自定义控件其实很简单1/3
    自定义控件其实很简单1/4
    自定义控件其实很简单1/6
    ListView addfooter 没显示 footer的原因(之一)
    android 版本和 api level 的对应关系
    derby入门
    OA系统与ERP的区别
    Windows下的定时任务
    linux学习笔记——安装问题
  • 原文地址:https://www.cnblogs.com/thmyl/p/6819436.html
Copyright © 2011-2022 走看看