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;
 ;
 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));
     ; i <= n; i++) cin >> w[i];
     ; i < n; i++) {
         int u, v;
         cin >> u >> v;
         add(u, v); add(v, u);
     }
     ans = -INF;
     ; i <= n; i++) dp[i] = -INF;
     dfs(, -);
     if(ans <= -INF) puts("Impossible");
     else cout << ans << endl;
     ;
 }

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. 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 ...

  3. Chloe and pleasant prizes

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

  4. Codeforces 418d Big Problems for Organizers [树形dp][倍增lca]

    题意: 给你一棵有n个节点的树,树的边权都是1. 有m次询问,每次询问输出树上所有节点离其较近结点距离的最大值. 思路: 1.首先是按照常规树形dp的思路维护一个子树节点中距离该点的最大值son_di ...

  5. Codeforces 581F Zublicanes and Mumocrates(树形DP)

    题目大概说有一棵树要给结点染色0或1,要求所有度为1的结点一半是0一半是1,然后问怎么染色,使两端点颜色不一样的边最少. dp[0/1][u][x]表示以u结点为根的子树中u结点是0/1色 且其子树有 ...

  6. Codeforces Round #384 (Div. 2)D-Chloe and pleasant prizes

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

  7. codeforces 161D Distance in Tree 树形dp

    题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...

  8. codeforces 337D Book of Evil (树形dp)

    题目链接:http://codeforces.com/problemset/problem/337/D 参考博客:http://www.cnblogs.com/chanme/p/3265913 题目大 ...

  9. codeforces 212E IT Restaurants(树形dp+背包思想)

    题目链接:http://codeforces.com/problemset/problem/212/E 题目大意:给你一个无向树,现在用两种颜色去给这颗树上的节点染色.用(a,b)表示两种颜色分别染的 ...

随机推荐

  1. Ubuntu14.04安装python3.5

    Ubuntu14.04系统会自带python2.7,请不要卸载它,不同版本的Python可以共存. #sudo add-apt-repository ppa:fkrull/deadsnakes #su ...

  2. lua 学习 (一 )Mac搭建lua环境和ide

    今天开始学习lua  首先是搭建环境 和 我的hello world 首先 交代一下我用的是 Mac 系统 所以在Mac上安装lua 环境很方便的 lua  Mointain Lion - Lua 5 ...

  3. [转]EntityFramework状态变化AutoDetectChangesEnabled与SaveChanged参数说明

    一.约定OnModelCreating 有一些限制需要注意,例如:1.表名不支持使用标签进行标注2.最小长度在 OnModelCreating 中不支持3.正则表达式在 OnModelCreating ...

  4. Excel 读写程序 C#源代码下载

    http://u.163.com/lNaJAjOz  提取码: E4ZHjnfD

  5. bootstrap表格内容跑到表格外面的处理办法

    http://stackoverflow.com/questions/21587813/bootstrap-responsive-table-content-wrapping td写下这个样式即可.& ...

  6. js005-引用类型

    js005-引用类型 数据类型分为基本类型和引用类型:基本类型值如下:Undefined.Null.Bollean.Number.String 本章内容: 1.使用对象 2.创建并操作数组 3.理解基 ...

  7. 2-c语言作业

    #include<stdio.h> #include<math.h> int main(void) { int money,year; double rate,sum; pri ...

  8. oracle树操作(select start with connect by prior)

    oracle中的递归查询可以使用:select .. start with .. connect by .. prior 下面将会讲述oracle中树形查询的常用方式,只涉及到一张表. 一. 建表语句 ...

  9. ExtJS-Viewport背景图片铺满浏览器视图并自动伸缩

    var viewport = Ext.create('Ext.container.Viewport', { style : 'background-image:url(login_bj.jpg);ba ...

  10. java 静态变量生命周期(类生命周期)

    Static: 加载:java虚拟机在加载类的过程中为静态变量分配内存. 类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享 销毁:类被卸载时,静态变量被销毁,并释放 ...