思路:

树形dp,首先使用dp计算以1为根的时候的最大分数,同时得到各个子树i的最大分数dp[i]。然后利用前面得到的dp数组分别计算以其他每个点作为根的时候的最大分数。

实现:

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
vector<int> G[N];
ll cnt[N], dp[N];
int n;
void dfs(int u, int p)
{
cnt[u] = ;
for (int i = ; i < G[u].size(); i++)
{
int t = G[u][i];
if (t == p) continue;
dfs(t, u);
cnt[u] += cnt[t];
dp[u] += dp[t];
}
dp[u] += cnt[u];
}
void dfs2(int u, int p, ll x, ll& ans)
{
ans = max(ans, dp[u] - cnt[u] + x + n);
for (int i = ; i < G[u].size(); i++)
{
int t = G[u][i];
if (t == p) continue;
dfs2(t, u, dp[u] - cnt[u] - dp[t] + x + n - cnt[t], ans);
}
}
int main()
{
int a, b;
while (cin >> n)
{
for (int i = ; i <= n; i++) G[i].clear();
memset(cnt, , sizeof cnt); memset(dp, , sizeof dp);
for (int i = ; i <= n - ; i++)
{
cin >> a >> b;
G[a].push_back(b); G[b].push_back(a);
}
dfs(, );
ll maxn = dp[];
for (int i = ; i < G[].size(); i++)
{
int t = G[][i];
dfs2(t, , dp[] - dp[t] - cnt[t], maxn);
}
cout << maxn << endl;
}
return ;
}

CF1187E Tree Painting的更多相关文章

  1. CF1187E Tree Painting【换根dp】

    题目传送门 题意 一棵$N$个节点的树,初始时所有的节点都是白色,第一次可以选择任意一个把它涂成黑色.接下来,只能把与黑色节点原来相连的白色节点涂成黑色(涂成黑色的点视为被删去,与其它节点不相连).每 ...

  2. 【CF1187E】Tree Painting

    题目大意:给定一棵 N 个点的树,初始全是白点.要求你做 N 步操作,每一次选定一个与一个黑点相隔一条边的白点,将它染成黑点,然后获得该白点被染色前所在的白色联通块大小的权值.第一次操作可以任意选点, ...

  3. HRBUST 2310 Tree Painting(无向图欧拉路径的性质)

    Give you a tree, can you draw the tree with minimum strokes without overlapping? Noted that it is ok ...

  4. CodeForce - 1187 E. Tree Painting (换根dp)

    You are given a tree (an undirected connected acyclic graph) consisting of nn vertices. You are play ...

  5. Codeforces 1187E - Tree Painting(树上所有节点的儿子数量和最大)

    乍一看题意比较麻烦,好像要删点求联通性,但其实是相当于求以某一个节点为根时,他的所有后代(儿子,儿子的儿子等等)的儿子的总和最大. 两边dfs即可,第一遍dfs随便找一个点为根,求出每个节点的儿子数s ...

  6. codeforces#1187E. Tree Painting(树换根)

    题目链接: http://codeforces.com/contest/1187/problem/E 题意: 给出一颗树,找到一个根节点,使所有节点的子节点数之和最大 数据范围: $2 \le n \ ...

  7. E. Tree Painting(树形换根dp)

    http://codeforces.com/contest/1187/problem/E 分析:问得分最高,实际上就是问以哪个节点出发得到的分数最多,而呈现成代码形式就变成了换根,max其得分!!!而 ...

  8. Educational Codeforces Round 67 E.Tree Painting (树形dp)

    题目链接 题意:给你一棵无根树,每次你可以选择一个点从白点变成黑点(除第一个点外别的点都要和黑点相邻),变成黑点后可以获得一个权值(白点组成连通块的大小) 问怎么使权值最大 思路:首先,一但根确定了, ...

  9. Educational Codeforces Round 67

    Educational Codeforces Round 67 CF1187B Letters Shop 二分 https://codeforces.com/contest/1187/submissi ...

随机推荐

  1. [Google Guava] 6-字符串处理:分割,连接,填充

    原文链接 译文链接 译者:沈义扬,校对:丁一 连接器[Joiner] 用分隔符把字符串序列连接起来也可能会遇上不必要的麻烦.如果字符串序列中含有null,那连接操作会更难.Fluent风格的Joine ...

  2. yii行为和过滤器

    行为是对类的功能进行了扩展,针对开闭原则,为了类的扩展而生,不去修改类原有的代码. yii的行为需要继承yii\base\Behavior,这就好比你要给人安装一个胳膊,这个胳膊得是人的,而不能是老虎 ...

  3. php中的print函数

    php print函数怎么用? 定义和用法 print() 函数输出一个或多个字符串. 注释:print() 函数实际不是一个函数,所以您不必对它使用括号. 提示:print() 函数比 echo() ...

  4. left

    left 语法: left: auto | <length> | <percentage> 默认值:auto 适用于:定位元素.即定义了 <' position '> ...

  5. 003转载----C#打开网页

    作者:微wx笑 来源:CSDN 原文:https://blog.csdn.net/testcs_dn/article/details/42246969 版权声明:本文为博主原创文章,转载请附上博文链接 ...

  6. 数据结构实验之二叉树五:层序遍历 (SDUT 3344)

    #include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; } ...

  7. Echarts案例-折线图

    一:先在官网下载 https://www.echartsjs.com/zh/download.html 然后再建立工程,导入这两个包: 写代码: <!DOCTYPE html> <h ...

  8. 对@repository,@Service, @Compent,@Controller注解的理解

    注解是没什么本质区别,都是声明作用,取不同的名字只是为了更好区分各自的功能. @Repository 用于标注数据访问组件,即DAO组件 @Service 用于标注业务层组件 @Controller ...

  9. 数据库groub by分组后,把多行数据合并成一行数据(Oracle、Postgres)

    关键字 row_number() over (partition by)   例如,下面的数据, 这是按照name分组后,展示property值. 我们想得到这样的值; 第一步:将每一组的proper ...

  10. 在Ubuntu18.04上安装Nvidia驱动

    拿到了一台新机子,带显卡的那种,当然是各种倒腾了!于是我又一天装了三遍机子来进行各种尝试熟悉配置啥的. 所以首先是在裸机上安装Nvidia驱动. 环境:Ubuntu18.04 刚安装完系统,当然是把软 ...