码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷P2633 王后万岁

时间:2016-11-09 11:49:56      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:space   连接   输出   struct   限制   printf   tin   i++   mct   

 

题目描述

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

 

水树规。

没有点数限制,所以直接枚举每个子树选或不选。

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #include<vector>
 8 using namespace std;
 9 const int mxn=16010;
10 int read(){
11     int x=0,f=1;char ch=getchar();
12     while(ch<0 || ch>9){if(ch==-)f=-1;ch=getchar();}
13     while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();}
14     return x*f;
15 }
16 int n;
17 int w[mxn];
18 struct edge{
19     int v,nxt;
20 }e[mxn<<1];
21 int hd[mxn],mct=0;
22 void add_edge(int u,int v){
23     e[++mct].v=v;e[mct].nxt=hd[u];hd[u]=mct;
24     return;
25 }
26 int f[mxn];
27 int ans=0;
28 void DP(int u,int fa){
29     for(int i=hd[u];i;i=e[i].nxt){
30         int v=e[i].v;
31         if(v==fa)continue;
32         DP(v,u);
33         f[u]=max(f[u],f[u]+f[v]);
34     }
35     ans=max(ans,f[u]);
36     return;
37 }
38 int main(){
39     n=read();
40     int i,j,u,v;
41     for(i=1;i<=n;i++)w[i]=read(),f[i]=w[i];
42     for(i=1;i<n;i++){
43         u=read();v=read();
44         add_edge(u,v);
45         add_edge(v,u);
46     }
47     DP(1,0);
48     printf("%d\n",ans);
49     return 0;
50 }

 

洛谷P2633 王后万岁

标签:space   连接   输出   struct   限制   printf   tin   i++   mct   

原文地址:http://www.cnblogs.com/SilverNebula/p/6045961.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!