比赛 20151026 评测结果 C
题目名称 火车站饭店 最终得分 0
用户昵称 柯哀王道 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2015-10-26 21:41:54
显示代码纯文本
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<memory>
#include<algorithm>
#include<string>
#include<climits>
#include<queue>
#include<vector>
#include<cstdlib>
#include<map>
using namespace std;

const int e=100020;
int f[e]={0},g[e]={0},a[e]={0},link[e]={0};//f[i]表示这条根要,g【i】表示不要;
int n,t=0;

struct qq
{
    int y,next;
}ee[2*e];

void insert(int startt,int endd)    //临界表存储树
{
    ee[++t].y=endd; ee[t].next=link[startt];
    link[startt]=t;
}

void dfs(int root,int father)
{
    int tempf=0,tempg=0;
    for(int i=link[root];i;i=ee[i].next)
    {
        if(ee[i].y!=father)
        {
            dfs(ee[i].y,root);
            f[root]+=g[ee[i].y];
            g[root]+=max(f[ee[i].y],g[ee[i].y]);
        }
    }
    f[root]+=a[root];
}

int main()
{
freopen("in.txt","r",stdin);
    cin>>n;
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    
    for(int i=1;i<n;i++)
    {
        int xx,yy;
        scanf("%d%d",&xx,&yy);
        insert(xx,yy);
        insert(yy,xx);
    }
    
    dfs(1,1);
    
    cout<<max(f[1],g[1]);
    
fclose(stdin);fclose(stdout);
return 0;
}