题目描述
byteland的王后深受百姓爱戴。为了表达他们的爱,国民们打算占领一个新的国家,并以王后的名字命名。这个国家有n座城市。城市之间有双向道路连接,且每两个城市之间有且仅有一条道路。每座城市对其拥有者来说都有一定的收益。尽管国民们非常爱戴他们的王后,他们并不一定会征服所有的城市献给她。他们只想占领一部分城市(至少有一座),这些城市必须满足两个条件:所有被占领的城市相互间必须是连通的,且城市收益之和最大。你的任务就是算出最大收益是多少。
输入输出格式
输入格式:
第一行是城市的数量n(1<=n<=16000)。第二行包含n个整数,依次表示每座城市的收益,每个数是-1000到1000之间的整数。下面的n-1行描述了道路:每行包含2个整数a和b,用一个空格隔开,表示这两个城市之间有一条道路。
输出格式:
仅有一个数,表示最大收益。
输入输出样例
输入样例#1:
5
-1 1 3 1 -1
4 1
1 3
1 2
4 5
输出样例#1:
4
【分析】
分享一个整日刷水题的我…
顺便给大家普及一下不过样例就交的危害
【代码】
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
const int mxn=20005;
vector <int> f[mxn];
int n,ans;
int val[mxn],dp[mxn];
inline void dfs(int u,int fa)
{
int i,j,k;
for(i=0;i<f[u].size();i++)
{
int v=f[u][i];
if(v==fa) continue;
dfs(v,u);
if(dp[v]>0) dp[u]+=dp[v];
}
dp[u]+=val[u];
}
int main()
{
int u,v;
scanf("%d",&n);
fo(i,1,n) scanf("%d",&val[i]);
fo(i,2,n)
{
scanf("%d%d",&u,&v);
f[u].push_back(v);
f[v].push_back(u);
}
dfs(1,0);
fo(i,1,n) ans=max(ans,dp[i]);
printf("%d\n",ans);
return 0;
}