树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; }
posted on 2017-04-18 09:17 HelloWorld!--By-MJY 阅读(120) 评论(0) 编辑 收藏 举报