zoukankan      html  css  js  c++  java
  • hdu 2196 Computer(树形DP)

    题目链接:hdu 2196 Computer

    题意:

    给你一棵n个节点,n-1条边的树,每条边有一个长度,求没,每个点到最远距离的点的长度。

    题解:

    紫书上也有讲:

    求一棵树最长的边的方法:随便找个点,dfs一遍求到长度最长的点s。

    然后以s点为根dfs一遍,同样找到长度最长的点t。

    然后在以t点为根,dfs一遍,求到所有点到t点的距离,

    对于每个点到最远距离的点的长度就是max(dis_s[i],dis_t[i])。

     1 #include<bits/stdc++.h>
     2 #define F(i,a,b) for(int i=a;i<=b;++i)
     3 using namespace std;
     4 const int N=1e4+7;
     5 
     6 int g[N],v[N*2],nxt[2*N],w[2*N],ed,n,s,t,dt[N],ds[N];
     7 
     8 void adg(int x,int y,int z){v[++ed]=y,w[ed]=z,nxt[ed]=g[x],g[x]=ed;}
     9 
    10 void dfs(int x,int fa,int dep,int *dis)
    11 {
    12     dis[x]=dep;
    13     for(int i=g[x];i;i=nxt[i])
    14         if(v[i]!=fa)dfs(v[i],x,dep+w[i],dis);
    15 }
    16 
    17 int main(){
    18     while(~scanf("%d",&n))
    19     {
    20         F(i,1,n)g[i]=0;ed=0;
    21         F(i,2,n)
    22         {
    23             int a,b;
    24             scanf("%d%d",&a,&b);
    25             adg(i,a,b),adg(a,i,b);
    26         }
    27         dfs(1,0,0,ds);
    28         int mx=0;
    29         F(i,1,n)if(ds[i]>mx)s=i,mx=ds[i];
    30         dfs(s,0,0,ds);
    31         mx=0;
    32         F(i,1,n)if(ds[i]>mx)t=i,mx=ds[i];
    33         dfs(t,0,0,dt);
    34         F(i,1,n)printf("%d
    ",max(ds[i],dt[i]));
    35     }
    36     return 0;
    37 }
    View Code
  • 相关阅读:
    项目01-nginx模块
    Spark机器学习
    项目01-手机端模块
    Spark内存管理
    Spark Streaming
    Spark SQL
    Spark Job调度
    Spark master节点HA配置
    机器学习
    07、Spark集群的进程管理
  • 原文地址:https://www.cnblogs.com/bin-gege/p/6476708.html
Copyright © 2011-2022 走看看