树DP

都类似

深搜处理出来一些信息 然后最后用一下

#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#include<cstring>
#include<iostream>
#include<string>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<iterator>
#include<stack>

using namespace std;

#define ll   __int64
#define MAXN  1000100
#define inf  2000000007

int w[MAXN];
struct node
{
    int to,next;
}edge[MAXN*2];

int cnt;
int head[MAXN];
void add(int u,int v)
{
    edge[cnt].to=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
int sum[MAXN],num[MAXN],sum1[MAXN];
void dfs(int u,int fa)
{
    num[u]=1;
    sum[u]=w[u]+w[fa]+1;
    sum1[u]=w[u]+w[fa];
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        int v=edge[i].to;
        num[u]++;
        if(v==fa)
            continue;
        dfs(v,u);
        sum[u]+=w[v]+1;
        sum1[u]+=w[v];
    }
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        cnt=0;
        memset(sum,0,sizeof(sum));
        memset(sum1,0,sizeof(sum1));
        memset(head,-1,sizeof(head));
        int ans=0;
        for(int i=1;i<=n;i++)
        {
             scanf("%d",&w[i]);
             ans=ans+w[i];
        }
        for(int i=1;i<n;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            add(a,b);
            add(b,a);
        }
        dfs(1,0);
        int mi=inf,ind;
        for(int i=1;i<=n;i++)
        {
            int a=ans-sum1[i]+sum[i]+2*(n-num[i]);
            mi=min(mi,a);
        }
        printf("%d\n",mi);
    }

    return 0;
}
View Code

 

posted on 2017-04-18 09:17  HelloWorld!--By-MJY  阅读(119)  评论(0编辑  收藏  举报

导航