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
原文地址:https://www.cnblogs.com/bin-gege/p/6476708.html