首页 > 代码库 > 洛谷P2633 王后万岁
洛谷P2633 王后万岁
题目描述
byteland的王后深受百姓爱戴。为了表达他们的爱,国民们打算占领一个新的国家,并以王后的名字命名。这个国家有n座城市。城市之间有双向道路连接,且每两个城市之间有且仅有一条道路。每座城市对其拥有者来说都有一定的收益。尽管国民们非常爱戴他们的王后,他们并不一定会征服所有的城市献给她。他们只想占领一部分城市(至少有一座),这些城市必须满足两个条件:所有被占领的城市相互间必须是连通的,且城市收益之和最大。你的任务就是算出最大收益是多少。
输入输出格式
输入格式:
第一行是城市的数量n(1<=n<=16000)。第二行包含n个整数,依次表示每座城市的收益,每个数是-1000到1000之间的整数。下面的n-1行描述了道路:每行包含2个整数a和b,用一个空格隔开,表示这两个城市之间有一条道路。
输出格式:
仅有一个数,表示最大收益。
输入输出样例
输入样例#1:
5-1 1 3 1 -14 11 31 24 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 王后万岁
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。