http://codeforces.com/contest/743/problem/D

如果我们知道mx[1]表示以1为根节点的子树中,点权值的最大和是多少(可能是整颗树,就是包括了自己)。那么,就可以O(n)扫一次各个点,对于每个点的儿子。

选出最大的两个mx[son],更新答案即可。(注意这个节点只有1个或者没有儿子,就要是-inf)

那么怎么得到这个mx[]呢?

可以知道mx[father] = max(所有的mx[son])

最后还要看看是否能选择整个树,所以用dp[cur]表示以cur为根的树的所有点券之和。

然后就能dfs算出mx[]和dp[]。然后O(n)扫一次就好。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
typedef long long int LL;
const LL inf = 1e16L; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 2e5 + ;
int a[maxn];
struct node {
int u, v, w;
int tonext;
}e[maxn << ];
int first[maxn];
int num;
void add(int u, int v) {
++num;
e[num].u = u;
e[num].v = v;
e[num].tonext = first[u];
first[u] = num;
}
bool vis[maxn];
LL dp[maxn];
LL mx[maxn];
void init(int cur) {
dp[cur] = a[cur];
mx[cur] = -inf;
for (int i = first[cur]; i; i = e[i].tonext) {
int v = e[i].v;
if (vis[v]) continue;
vis[v] = true;
init(v);
dp[cur] += dp[v];
mx[cur] = max(mx[cur], mx[v]);
// mx[cur] = max(mx[cur], dp[v]);
}
mx[cur] = max(dp[cur], mx[cur]);
}
LL ans = -inf;
void dfs(int cur, int fa) {
LL mx1 = -inf, mx2 = -inf;
int t = ;
for (int i = first[cur]; i; i = e[i].tonext) {
int v = e[i].v;
if (fa == v) continue;
dfs(v, cur);
t++;
if (mx1 <= mx[v]) {
mx2 = mx1;
mx1 = mx[v];
} else if (mx2 <= mx[v]) {
mx2 = mx[v];
}
}
if (t == || t == ) return;
ans = max(ans, mx1 + mx2);
}
void work() {
int n;
scanf("%d", &n);
for (int i = ; i <= n; ++i) {
scanf("%d", &a[i]);
}
for (int i = ; i <= n - ; ++i) {
int u, v;
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
vis[] = true;
init();
// printf("%d\n", dp[6]);
// cout << mx[5] << endl;
memset(vis, , sizeof vis);
dfs(, );
if (ans <= -inf) {
cout << "Impossible" << endl;
} else cout << ans << endl;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}

最新文章

  1. 保留password模式文本框textbox内的数据不丢失。
  2. (三)play之yabe项目【数据模型】
  3. 判断变量是否为json对象
  4. 十五、struts2中的拦截器(框架功能核心)
  5. 关于java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream解决办法
  6. HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)
  7. Spring 拦截器配置
  8. 如果利用storyboard创建cell中标识符identifier的正确设置
  9. 优化移动设备上SharePoint 2013网站
  10. 开发中mysql和oracle的区别
  11. 机器学习之Logistic 回归算法
  12. [ipsec][crypto] 在IPSec ESP使用AES-GCM加密时的IV
  13. [LeetCode] 830. Positions of Large Groups_Easy tag: Two Pointers
  14. Mysql报错java.sql.SQLException:null,message from server:&quot;Host &#39;27,45,38,132&#39; is not allowed to connect
  15. CAD中的各种Polyline
  16. EF 求和 GroupBy多个字段
  17. 《MySQL技术内幕 InnoDB存储引擎 》学习笔记
  18. Eclipse 设置代码风格
  19. day4:vcp考试
  20. 关于UC浏览器兼容scroll事件问题

热门文章

  1. Activity调用isDestroyed()方法报出,java.lang.NoSuchMethodError
  2. Android +NDK+eclipse+opengl ES2.0 开启深度測试
  3. js中字符串的拼接的另一种方法
  4. Xcode 中的小技巧
  5. call function
  6. LIKIE INSTR
  7. JDBC访问数据库查询信息的步骤(硬编码格式)
  8. Hadoop Hive概念学习系列之hive里的索引(十三)
  9. linux CANopenSocket 初试
  10. I.MX6 简单电路模拟USB设备的插入