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

题意:求最大两个的不相交子树的点权和,如果没有两个不相交子树,那么输出Impossible。

思路:之前好像也做过这种类型的题目啊,知道是树形DP,但是不知道怎么保证两个不相交。看别人代码之后,

在DFS回溯的时候,

 void dfs(int u, int fa) {
sum[u] = w[u];
for(int i = head[u]; ~i; i = edge[i].nxt) {
int v = edge[i].v;
if(v == fa) continue;
dfs(v, u);
sum[u] += sum[v];
if(dp[u] > -INF) ans = max(ans, dp[u] + dp[v]);
dp[u] = max(dp[u], dp[v]);
}
dp[u] = max(dp[u], sum[u]);
}

先执行 if 语句的话,可以保证只有以 u 结点为根的时候,它的子树有两个或两个以上,否则就不会更新 ans 了。并且这个时候dp【u】还只是目前扫过的一个子树的最大权值和,再加上一个次大的dp【v】,这样就可以保证是最大的两个不相交子树的权值和了。遍历完后dp【u】一定是以 u 为根的所有子树的最大权值和,再和 sum【u】更新是否要包含u这个节点的权值。

 #include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
#define N 200010
typedef long long LL;
const LL INF = 1LL<<;
struct node
{
int v, nxt;
}edge[N*];
LL dp[N], sum[N], w[N], head[N], tot, ans; void add(int u, int v) {
edge[tot].v = v; edge[tot].nxt = head[u]; head[u] = tot++;
} void dfs(int u, int fa) {
sum[u] = w[u];
for(int i = head[u]; ~i; i = edge[i].nxt) {
int v = edge[i].v;
if(v == fa) continue;
dfs(v, u);
sum[u] += sum[v];
if(dp[u] > -INF) ans = max(ans, dp[u] + dp[v]);
dp[u] = max(dp[u], dp[v]);
}
dp[u] = max(dp[u], sum[u]);
} int main()
{
int n;
cin >> n;
memset(head, -, sizeof(head));
for(int i = ; i <= n; i++) cin >> w[i];
for(int i = ; i < n; i++) {
int u, v;
cin >> u >> v;
add(u, v); add(v, u);
}
ans = -INF;
for(int i = ; i <= n; i++) dp[i] = -INF;
dfs(, -);
if(ans <= -INF) puts("Impossible");
else cout << ans << endl;
return ;
}

Codeforces 743D:Chloe and pleasant prizes(树形DP)的更多相关文章

  1. Codeforces Round #384 (Div. 2)D - Chloe and pleasant prizes 树形dp

    D - Chloe and pleasant prizes 链接 http://codeforces.com/contest/743/problem/D 题面 Generous sponsors of ...

  2. Codeforces 743D Chloe and pleasant prizes(树型DP)

                                                                D. Chloe and pleasant prizes             ...

  3. CodeForces - 743D Chloe and pleasant prizes

    Chloe and pleasant prizes time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  4. codeforces 743D. Chloe and pleasant prizes(树形dp)

    题目链接:http://codeforces.com/contest/743/problem/D 大致思路挺简单的就是找到一个父节点然后再找到其两个字节点总值的最大值. 可以设一个dp[x]表示x节点 ...

  5. coderforces #384 D Chloe and pleasant prizes(DP)

    Chloe and pleasant prizes time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  6. D. Chloe and pleasant prizes 树上dp + dfs

    http://codeforces.com/contest/743/problem/D 如果我们知道mx[1]表示以1为根节点的子树中,点权值的最大和是多少(可能是整颗树,就是包括了自己).那么,就可 ...

  7. D. Chloe and pleasant prizes

    D. Chloe and pleasant prizes time limit per test 2 seconds memory limit per test 256 megabytes input ...

  8. Chloe and pleasant prizes

    Chloe and pleasant prizes time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  9. [Codeforces743D][luogu CF743D]Chloe and pleasant prizes[树状DP入门][毒瘤数据]

    这个题的数据真的很毒瘤,身为一个交了8遍的蒟蒻的呐喊(嘤嘤嘤) 个人认为作为一个树状DP的入门题十分合适,同时建议做完这个题之后再去做一下这个题 选课 同时在这里挂一个选取节点型树形DP的状态转移方程 ...

随机推荐

  1. Python模块(radom)

    radom radom模块提供了随机生成对象的方法 Help on module random: NAME random - Random variable generators. FILE /usr ...

  2. 01.Box2dWeb入门教程

    1.下载box2dweb.直接在页面中引用即可. -Box2D.js是未压缩版 -Box2d.min.js是压缩版 2.编写HelloWorld代码. <!DOCTYPE HTML> &l ...

  3. ON_NOTIFY_REFLECT : Message Reflection for Windows Controls

    转自: https://msdn.microsoft.com/en-us/library/eeah46xd.aspx TN062: Message Reflection for Windows Con ...

  4. Eureka的故事,专注能让你看到别人看不到的事情

    有这么一句古老的箴言: 如果你手里有一把锤子,所有东西看上去都像钉子. 其实这句话已经是老调中的老调重弹了,我们程序员有很多锤子:OO.设计模式.语言(C, C++, Java, Python, Ru ...

  5. pip报ssl错误解决

     InsecurePlatformWarning: A true SSLContext object is not available.   # yum -y install openssl-deve ...

  6. oracle调整表中列顺序

    有一个哥们提出一个问题: 有个表,创建时候的列顺序是a,b,c 如何使用select * 的时候,让列的显示顺序是a,c,b 而且任性地必须使用select *来查询,且不能重建表. 假设有个表tes ...

  7. 转:python webdriver API 之下载文件

    webdriver 允许我们设置默认的文件下载路径.也就是说文件会自动下载并且存在设置的那个目录中.要想下载文件,首选要先确定你所要下载的文件的类型.要识别自动文件的下载类型可以使用 curl ,如图 ...

  8. 转:python webdriver API 之定位一组对象

    webdriver 可以很方便的使用 find_element 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,WebElement 接口同样提供了定位一组元素的方法 find_eleme ...

  9. [转]MySQL数据库引擎

    经常用MySQL数据库,但是,你在用的时候注意过没有,数据库的存储引擎,可能有注意但是并不清楚什么意思,可能根本没注意过这个问题,使用了默认的数据库引擎,当然我之前属于后者,后来成了前者,然后就有了这 ...

  10. vs2010打包系统必备选择.net framework 3.5sp1编译错误的解决方法

    利用visual studio 2010进行打包程序,默认安装的是Framework 4.0,如果需要将3.5sp1打包到系统中一起安装(选择了"从与我的应用程序相同的位置下载系统必备组件& ...