树形dp

#include <bits/stdc++.h>
 
using namespace std;
 
const int maxn=200000;
int f[maxn][2],w[maxn],head[maxn];
int cnt;
bool vis[maxn];
 
inline int read(){
 
    int num=0,f=1; char c=getchar();
 
    while(!isdigit(c)){
 
        if(c=='-') f=-1; c=getchar();
    }
 
    while(isdigit(c)){
 
        num=(num+(num<<2)<<1)+(c^48); c=getchar();
    }
 
    return num*f;
}
 
struct node{
 
   int end,next;    
 
}e[maxn];
 
inline void add_edge(int,int);
void dfs(int);
 
inline void add_edge(int a,int b){
 
    e[++cnt].end=b;
   
    e[cnt].next=head[a];
 
    head[a]=cnt;
  //  cout<<a<<" "<<head[a]<<endl;
  //  cout<<e[cnt].next<<" "<<endl;
 
}
 
void dfs(int u){
 
    int v;
 
    vis[u]=1;
 
    for(int i=head[u];i!=0;i=e[i].next){
 
       v=e[i].end; //cout<<vis[v]<<" "; cout<<endl<<endl;
 
       if(vis[v]==1) continue;
     
       dfs(v);
 
       f[u][0]+=f[v][1];
   
       f[u][1]+=max(f[v][0],f[v][1]);
    }
 
    f[u][0]+=w[u];
 
    //cout<<f[u][0]<<" ";
    //cout<<endl<<endl;
 
    return;
}
 
int main(){
 
    freopen("profitz.in","r",stdin);
    freopen("profitz.out","w",stdout);
 
    int n,a,b;
 
    n=read();
 
    for(int i=1;i<=n;i++){
 
        w[i]=read();
    }
 
    for(int i=1;i<n;i++){
 
       a=read(); b=read();
 
       add_edge(a,b);
       add_edge(b,a);
    }
 
//    for(int i=1;i<=cnt;i++){
//
//        cout<<e[i].next<<" "<<endl;
//    }
 
    dfs(1);
 
 
/*    for(int i=1;i<=n;i++){
 
        cout<<f[i][0]<<" "<<f[i][1];
        cout<<endl;
    }
*/    
    int ans=max(f[1][1],f[1][0]);
 
    cout<<ans;
 
    return 0;
}
  
 
cogs.pro 火车站饭店 

 

posted @ 2017-09-28 21:17  TimDucan  阅读(102)  评论(0编辑  收藏  举报