想了很久, 以为是网络流最大流, 后来建模建不出来, 无奈。

后来看了 https://blog.csdn.net/hao_zong_yin/article/details/79441180

感觉思路很巧妙。

首先题目等价于让每条边经过的次数最多。

那么假设一条边点a到点b, 假设以b为根节点的子树中的节点数为pb, 那么剩下的

以以b为根节点的子树中的节点数为pa

我们假设pa > pb

那么从a这边去b这边, 最多只能走pb次, 因为不能到同一个点,b那边最多就pb个点

如果经过次数大于pb的话就说明肯定b那边的点至少一个点经过了两次以上

那么b这边最多去a那边也是pb次, 这次是因为起点就这么多个点。

所以这条边走过的次数就是pb * 2, 算上权值就是pb * 2 * cost

那么我们就可以得出, 对于一条边u1, u2, 那么经过这条边的最大权值为

min(dp[u1], n - dp[u1]) * cost * 2

dp[u]表示以u为根节点的子树中节点的个数。

所以我们每条边都加上最大权值即为答案

最后注意要开 long long。

#include<cstdio>
#include<algorithm>
#include<vector>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; typedef long long ll;
const int MAXN = 112345;
struct node { int v, w; };
vector<node> g[MAXN];
int n, dp[MAXN];
ll ans; void dfs(int u, int fa)
{
dp[u] = 1;
REP(i, 0, g[u].size())
{
int v = g[u][i].v, w = g[u][i].w;
if(v == fa) continue;
dfs(v, u);
ans += min(dp[v], n - dp[v]) * w * 2;
dp[u] += dp[v];
}
} int main()
{
int T, kase = 0;
scanf("%d", &T); while(T--)
{
scanf("%d", &n);
REP(i, 0, n) g[i].clear();
REP(i, 0, n - 1)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
u--; v--;
g[u].push_back(node{v, w});
g[v].push_back(node{u, w});
} ans = 0;
dfs(0, -1);
printf("Case #%d: %lld\n", ++kase, ans);
} return 0;
}

紫书 习题 11-16 UVa 1669(树形dp)的更多相关文章

  1. 紫书 习题 11-9 UVa 12549 (二分图最小点覆盖)

    用到了二分图的一些性质, 最大匹配数=最小点覆盖 貌似在白书上有讲 还不是很懂, 自己看着别人的博客用网络流写了一遍 反正以后学白书应该会系统学二分图的,紫书上没讲深. 目前就这样吧. #includ ...

  2. 紫书 习题 11-8 UVa 1663 (最大流求二分图最大基数匹配)

    很奇怪, 看到网上用的都是匈牙利算法求最大基数匹配 紫书上压根没讲这个算法, 而是用最大流求的. 难道是因为第一个人用匈牙利算法然后其他所有的博客都是看这个博客的吗? 很有可能-- 回归正题. 题目中 ...

  3. 紫书 习题8-12 UVa 1153(贪心)

    本来以为这道题是考不相交区间, 结果还专门复习了一遍前面写的, 然后发现这道题的区间是不是 固定的, 是在一个范围内"滑动的", 只要右端点不超过截止时间就ok. 然后我就先考虑有 ...

  4. 紫书 习题8-7 UVa 11925(构造法, 不需逆向)

    这道题的意思紫书上是错误的-- 难怪一开始我非常奇怪为什么第二个样例输出的是2, 按照紫书上的意思应该是22 然后就不管了,先写, 然后就WA了. 然后看了https://blog.csdn.net/ ...

  5. uva 1292 树形dp

    UVA 1292 - Strategic game 守卫城市,城市由n个点和n-1条边组成的树,要求在点上安排士兵,守卫与点相连的边.问最少要安排多少士兵. 典型的树形dp.每一个点有两个状态: dp ...

  6. UVA 10859 树形DP

    很明显的树形DP了,设状态dp[i][0],dp[i][1].枚举子节点放或不放的两种状态. 在此学到一种不同于一般处理的方法,题目要求被两灯照亮的边尽量多,反过来即被一灯照亮的尽量少设为e.又需要的 ...

  7. 紫书 习题 11-10 UVa 12264 (二分答案+最大流)

    书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最 ...

  8. 紫书 习题 10-13 UVa 11526(打表找规律+分步枚举)

    首先看这道题目,我预感商数肯定是有规律的排列的,于是我打表找一下规律 100 / 1 = 100 100 / 2 = 50  100 / 3 = 33  100 / 4 = 25  100 / 5 = ...

  9. UVA 1594 Ducci Sequence(紫书习题5-2 简单模拟题)

    A Ducci sequence is a sequence of n-tuples of integers. Given an n-tuple of integers (a1, a2, · · · ...

随机推荐

  1. epoll的边缘触发与水平触发

    epoll的边缘触发与水平触发 Tcp连接是双向的,内核为每个socket维护两个缓冲区,读缓冲区与写缓冲区,内核会一个关注这两个缓冲区,当采用水平触发时,对于写缓冲区而言,如果有多余空间可写,对于读 ...

  2. 一些html5

    ---匿名函数(funcation(){}())---- 一.拖拽 draggable=ture-----A拖动元素上事件 1. 拖拽开始:ondragstart2. 拖拽中:ondrag3. 拖拽结 ...

  3. CF508E (贪心+搜索+构造)

    题目大意:让你构造一个括号序列,括号匹配的方式类似于栈,给出从左数每个括号 到和它匹配的右括号的 最小和最大距离,让你输出一个合法括号序列 看错题了以为是二分图,然后写了搜索 贪心发现如果距离往小了填 ...

  4. python3 继承与组合

    什么叫继承? 所谓继承,就是class_A里面的功能从class_B中直接获取,从而节约了代码且使用方便. 什么叫组合? 除了继承,还有一种我们可以实现目的的方式,那就是组合,同样可以节约代码.只不过 ...

  5. python学习笔记:第三天

    day03: 1.python中所有的变量都可以改变 2.Print(name)   打印 3.Del name  删除 4.python中python2与python3不能兼容,需要分别安装pyth ...

  6. 【Codeforces Round #476 (Div. 2) [Thanks, Telegram!] A】Paper Airplanes

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 统计每个人需要的sheet个数. 乘上k 然后除p就是需要的pack个数了 [代码] #include <bits/stdc+ ...

  7. SQLSERVER-存储过程知识点

    原文链接:http://www.qeefee.com/article/000566 存储过程是一组预编译的SQL语句,它可以包含数据操纵语句.变量.逻辑控制语句等. 存储过程允许带参数: 输入参数:可 ...

  8. 洛谷 P3047 [USACO12FEB]附近的牛Nearby Cows

    P3047 [USACO12FEB]附近的牛Nearby Cows 题目描述 Farmer John has noticed that his cows often move between near ...

  9. Android 中模仿 Twitter 实现 Toolbar Indicator

    项目地址:https://github.com/nekocode/ToolbarIndicator

  10. freeradius 启动报错Refusing to start with libssl version OpenSSL 1.0.1

    改动etc/raddb下的radiusd.conf文件 找到allow_vulnerable_openssl = no,改动成allow_vulnerable_openssl = yes