博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SGU 143.Long Live the Queen(女王万岁)
阅读量:6166 次
发布时间:2019-06-21

本文共 1245 字,大约阅读时间需要 4 分钟。

时间限制:0.25s

空间限制:4M

题意:

有n(n<=16000)个小镇,每两个小镇有且仅有一条路径相连。每个小镇有一个收益x(-1000<=x<=1000).    现在要求,选择一些小镇,满足下面两点要求:    1.选择的小镇都能互相到达,并且路径上的小镇也被选择了.    2.选择的小镇的收益和最大.

输入

一个整数n,接下来n个整数,代表这n个小镇的收益.   接下来n-1行,每行两个整数代表这两个小镇有道路直接相连.

输出

一个整数,代表最大的收益

Sample Input

5-1 1 3 1 -14 11 31 24 5

Sample Output

4

 

 

 

 


 

Solution:

                先来分析一下题目模型

 

             有一颗n(n<=16000)个节点的树,每个节点都有一个权值k(-1000<=k<=1000),

 

             求这颗树的一颗子树,使得子树的所有节点的权值和最大.

 

             假设已经选择了一些点,对于于他相邻的点,求出相邻点的连通块的和的最大值,如果这个值大于0,那么久把这个连通块加入选择.

             DFS即可.

 

参考代码:

 

 

#include 
#include
#include
#include
#define INf 16666#define Maxn 0xfffffffusing namespace std;vector
g[INf];int val[INf], f[INf];int n, x, y, tem;int dfs (int x, int fa) { f[x] = val[x]; for (int i = 0; i < g[x].size(); i++) { tem=0; if (g[x][i] != fa) tem = dfs (g[x][i], x); if (tem > 0) f[x] += tem; } return f[x];}int main() { scanf ("%d", &n); for (int i = 1; i <= n; i++) scanf ("%d", &val[i]); for (int i = 1; i < n; i++) { scanf ("%d %d", &x, &y); g[x].push_back (y); g[y].push_back (x); } dfs (1, -1); int ans = -Maxn; for (int i = 1; i <=n; i++) ans = max (ans, f[i]); printf ("%d", ans);}

 

  

         

 

转载于:https://www.cnblogs.com/keam37/p/3840422.html

你可能感兴趣的文章
11G Oracle RAC添加新表空间时数据文件误放置到本地文件系统的修正
查看>>
从91移动应用发展趋势报告看国内应用现状
查看>>
【ORACLE技术嘉年华PPT】MySQL压力测试经验
查看>>
Linux下汇编调试器GDB的使用
查看>>
css溢出机制探究
查看>>
vue中如何实现后台管理系统的权限控制
查看>>
关于angularjs过滤器的理解
查看>>
vue 使用html2canvas将DOM转化为图片
查看>>
angular编辑-初始化变量失败
查看>>
jQuery源码解析之Data
查看>>
React Native Cannot read property 'bindings' of null (null)) 解决!
查看>>
同样的神经网络引擎,苹果A11芯片比华为麒麟970牛在哪?
查看>>
ucar-weex
查看>>
vuex 理解与应用
查看>>
ES6(3)-各种类型的扩展(数组、对象)
查看>>
eclipse部署web项目至本地的tomcat但在webapps中找不到
查看>>
mysql 分组
查看>>
Android JNI入门第三篇——jni头文件分析
查看>>
ubuntu server 10.4下NFS服务的配置
查看>>
nginx+php-FastCGI+mysql性能测试
查看>>