树的直径dp模板

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=100005;
 6 int n,m,t,ans;
 7 int f1[N],f2[N];
 8 int first[N],v[N],w[N],next[N];
 9 void add(int x,int y,int z)
10 {
11     t++;
12     next[t]=first[x];
13     first[x]=t;
14     v[t]=y;
15     w[t]=z;
16 }
17 void dp(int x,int father)
18 {
19     int i,j;
20     for(i=first[x];i;i=next[i])
21     {
22         j=v[i];
23         if(j==father)
24           continue;
25         dp(j,x);
26         if(f1[x]<f1[j]+w[i])
27         {
28             f2[x]=f1[x];
29             f1[x]=f1[j]+w[i];
30         }
31         else if(f2[x]<f1[j]+w[i])
32           f2[x]=f1[j]+w[i];
33         ans=max(ans,f1[x]+f2[x]);
34     }
35 }
36 int main()
37 {
38     int x,y,z,i;
39     scanf("%d%d",&n,&m);
40     for(i=1;i<=m;++i)
41     {
42         scanf("%d%d%d",&x,&y,&z);
43         add(x,y,z);
44         add(y,x,z);
45     }
46     dp(1,0);
47     printf("%d",ans);
48     return 0;
49 }

 

posted @ 2019-07-16 21:34  zgym  阅读(270)  评论(1编辑  收藏  举报