zoukankan      html  css  js  c++  java
  • hdu 3534 Tree(树形DP)

    题目链接:hdu 3534 Tree

    题意:

    给你一棵n个节点,n-1条边的树,每条边有一个长度,现在问你最长的边的长度为多少,有多少条。

    题解:

    其实这种题不用记录最长和次长,我们开两个数组,len[i],num[i]。

    表示以i为根结点出发的最长的长度以及最长的边的条数。

    然后我们只需要一个dfs,先用子节点的信息来更新答案,然后在更新当前节点的len和num记录的信息。

    这样就不用记录最长和次长。

     1 #include<bits/stdc++.h>
     2 #define mst(a,b) memset(a,b,sizeof(a))
     3 #define F(i,a,b) for(int i=a;i<=b;++i)
     4 using namespace std;
     5 typedef long long ll;
     6 
     7 const int N=1e4+7;
     8 
     9 int g[N],v[N*2],nxt[N*2],w[N*2],ed;
    10 int n,ans,k,len[N],num[N];
    11 
    12 void adg(int x,int y,int z){v[++ed]=y,w[ed]=z,nxt[ed]=g[x],g[x]=ed;}
    13 
    14 void dfs(int x,int fa)
    15 {
    16     len[x]=0,num[x]=1;
    17     for(int i=g[x];i;i=nxt[i])if(v[i]!=fa)
    18     {
    19         dfs(v[i],x);
    20         int tmp=w[i]+len[v[i]];
    21         if(tmp+len[x]>ans)ans=tmp+len[x],k=num[x]*num[v[i]];
    22         else if(tmp+len[x]==ans)k+=num[x]*num[v[i]];
    23         if(tmp>len[x])len[x]=tmp,num[x]=num[v[i]];
    24         else if(tmp==len[x])num[x]+=num[v[i]];
    25     }
    26 }
    27 
    28 int main(){
    29     while(~scanf("%d",&n))
    30     {
    31         mst(g,0),ed=0;
    32         int x,y,z;
    33         F(i,1,n-1)
    34         {
    35             scanf("%d%d%d",&x,&y,&z);
    36             adg(x,y,z),adg(y,x,z);
    37         }
    38         ans=-INT_MAX,k=0;
    39         dfs(1,0),printf("%d %d
    ",ans,k);
    40     }
    41     return 0;
    42 }
    View Code
  • 相关阅读:
    [leetcode-604-Design Compressed String Iterator]
    [leetcode-617-Merge Two Binary Trees]
    OpenCV学习1-----打开摄像头并在画面上添加水印
    cvCvtColor与cvtColor区别
    [leetcode-547-Friend Circles]
    [leetcode-260-Single Number III]
    复位电路
    单片机特殊功能寄存器
    单片机的定时器与计数器
    单片机定时/计数工作方式
  • 原文地址:https://www.cnblogs.com/bin-gege/p/6475408.html
Copyright © 2011-2022 走看看