zoukankan      html  css  js  c++  java
  • hdu2196(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196

    题意:一个有N个结点的树,给你相邻两个结点的距离,问你对于第i个结点,树中离i最远的结点的距离是多少。

    分析:因为树上任意某个节点到树上任意节点的最远距离的端点一定会是树上直径的两个端点之一。(树的直径为树上距离最大的两个点组成)。因此由任意选个点根据最大值dfs求出树的直径的一个断点,再从端点出发dfs求出另外个端点,再从另个端点dfs扫一遍。那么由树的直径的两个端点扫过后的每个点距离就是最大距离。

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <cstdlib>
    #include <stack>
    #include <vector>
    #include <set>
    #include <map>
    #define LL long long
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define N 10010
    #define clr(a) (memset(a,0,sizeof(a)))
    using namespace std;
    struct edge
    {
        int next,v,w;
        edge(){}
        edge(int v,int w,int next):v(v),w(w),next(next){}
    }e[N*2];
    int dp[N],head[N],tot,n,st,mx;
    void addedge(int u,int v,int w)
    {
        e[tot]=edge(v,w,head[u]);
        head[u]=tot++;
    }
    void dfs(int u,int fa,int sum)
    {
        if(sum>=mx)mx=sum,st=u;
        for(int i=head[u];~i;i=e[i].next)
        {
            int v=e[i].v;
            if(v==fa)continue;
            dp[v]=max(sum+e[i].w,dp[v]);
            dfs(v,u,sum+e[i].w);
        }
    }
    int main()
    {
        int u,v;
        while(scanf("%d",&n)>0)
        {
            clr(dp);tot=0;
            memset(head,-1,sizeof(head));
            for(int i=2;i<=n;i++)
            {
                scanf("%d%d",&u,&v);
                addedge(i,u,v);
                addedge(u,i,v);
            }
            mx=0;
            dfs(1,0,0);
            dfs(st,0,0);
            dfs(st,0,0);
            for(int i=1;i<=n;i++)printf("%d
    ",dp[i]);
        }
    }
    View Code
  • 相关阅读:
    Armbian hostname and WiFi configuration
    尼采的哲学
    深度学习 —— 使用 gensim 实现 word2vec
    sklearn preprocessing 数据预处理(OneHotEncoder)
    中英文对照 —— 饮食与美食
    matlab 常用机器学习算法的实现
    linux下svn常用指令
    Python创建删除文件
    php使用mysql和mysqli连接查询数据
    vsftpd配置文件详解
  • 原文地址:https://www.cnblogs.com/lienus/p/4199822.html
Copyright © 2011-2022 走看看