周末牛客挂了个更难的,这个简单一些

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define maxn 200100
using namespace std;
typedef long long ll;
struct Node {
int p;
int len;
Node(int a, int b) :p(a), len(b) {}
};
vector<Node>G[maxn];
void insert(int be, int en, int len) {
G[be].push_back(Node(en, len));
}
int t;
ll list[maxn];
int de[maxn];
int dfs(int x, int fa) {
for (int i = 0; i < G[x].size(); i++) {
int p = G[x][i].p;
ll ln = G[x][i].len;
if (p == fa) continue;
dfs(p, x);
if (de[p] == 1) list[x] += ln;
else list[x] += min(ln, list[p]);
}
return 0;
}
ll f[maxn];
int dfs1(int x, int fa) { for (int i = 0; i < G[x].size(); i++) {
int p = G[x][i].p;
ll ln = G[x][i].len;
if (p == fa) continue;
if (de[x] == 1) f[p] = list[p] + ln;
else f[p] = list[p] + min(ln, f[x] - min(ln, list[p])); dfs1(p, x);
}
return 0;
}
int main() {
int n;
scanf("%d", &t);
while (t--) {
int be, en;
scanf("%d", &n);
memset(list, 0, sizeof(list));
memset(de, 0, sizeof(de));
memset(f, 0, sizeof(f));
for (int i = 0; i <= n; i++) G[i].clear();
int len;
for (int i = 1; i < n; i++) {
scanf("%d %d %d", &be, &en, &len);
insert(be, en, len);
insert(en, be, len);
de[be]++;
de[en]++;
}
dfs(2, -1);
f[2] = list[2];
dfs1(2, -1);
ll ans = 0;
for (int i = 1; i <= n; i++) {
ans = max(ans, f[i]);
}
printf("%d\n", ans);
}
return 0;
}

  

poj - 3585(二次扫描与换根法)的更多相关文章

  1. poj 3585 Accumulation Degree(二次扫描和换根法)

    Accumulation Degree 大致题意:有一棵流量树,它的每一条边都有一个正流量,树上所有度数为一的节点都是出口,相应的树上每一个节点都有一个权值,它表示从这个节点向其他出口可以输送的最大总 ...

  2. 题解 poj3585 Accumulation Degree (树形dp)(二次扫描和换根法)

    写一篇题解,以纪念调了一个小时的经历(就是因为边的数组没有乘2 phhhh QAQ) 题目 题目大意:找一个点使得从这个点出发作为源点,流出的流量最大,输出这个最大的流量. 以这道题来介绍二次扫描和换 ...

  3. POJ3585 Accumulation Degree(二次扫描与换根法)

    题目:http://poj.org/problem?id=3585 很容易想出暴力.那么就先扫一遍. 然后得到了指定一个根后每个点的子树值. 怎么转化利用一下呢?要是能找出当前点的父亲的 “ 不含当前 ...

  4. $Poj3585\ Accumulation Degree$ 树形$DP/$二次扫描与换根法

    Poj Description 有一个树形的水系,由n-1条河道与n个交叉点组成.每条河道有一个容量,联结x与y的河道容量记为c(x,y),河道的单位时间水量不能超过它的容量.有一个结点是整个水系的发 ...

  5. 【51Nod1405】树上距离和 二次扫描与换根法

    题目大意:给定一棵 N 个点的边权均为 1 的树,依次输出每个点到其他各个点的距离和. 题解:首先任意选定一个节点为根节点,比如 1,第一遍 dfs 遍历树求出子树大小.树上前缀和.第二遍 dfs 遍 ...

  6. 【POJ3585】Accumulation Degree 二次扫描与换根法

    简单来说,这是一道树形结构上的最大流问题. 朴素的解法是可以以每个节点为源点,单独进行一次dp,时间复杂度是\(O(n^2)\) 但是在朴素求解的过程中,相当于每次都求解了一次整棵树的信息,会做了不少 ...

  7. poj3585 树形dp 二次扫描,换根法模板题

    #include<iostream> #include<cstring> #include<cstdio> #include<vector> using ...

  8. [LuoguP1829]Crash的文明表格(二次扫描与换根+第二类斯特林数)

    Solution: ​ 由于 \[ x^m = \sum_{i=0}^m{~m~\choose i}{~x~\brace i}i! \] ​ 将所求的式子化成这样,挖掘其性质,考虑是否能从儿子转移(或 ...

  9. poj3585树最大流——换根法

    题目:http://poj.org/problem?id=3585 二次扫描与换根法,一次dfs求出以某个节点为根的相关值,再dfs遍历一遍树,根据之前的值换根取最大值为答案. 代码如下: #incl ...

随机推荐

  1. 用GitHub Pages搭了个博客,欢迎来玩~

    Welcome to visit my new blog https://luoxiaolei.github.io/ Ps. 后续的blog会优先更新到GitHub Pages上.

  2. keep-alive vue组件缓存避免多次加载相应的组件

    keep-alive vue组件缓存避免多次加载相应的组件

  3. 自定义View系列教程02--onMeasure源码详尽分析

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  4. HDFS概念名称节点和数据节点-基本模型

  5. 威胁快报|新兴挖矿团伙借助shodan作恶,非web应用安全再鸣警钟

    近日,阿里云安全发现了一个使用未授权访问漏洞部署恶意Docker镜像进行挖矿的僵尸网络团伙.我们给这一团伙取名为Xulu,因为该团伙使用这个字符串作为挖矿时的用户名. Xulu并不是第一个攻击Dock ...

  6. 最适合 Python 入门的资源有哪些?

    https://blog.csdn.net/zV3e189oS5c0tSknrBCL/article/details/81230593 学习任何一门编程语言或者技能基本上都遵循3个步骤,第一步是看,第 ...

  7. Sublime插件:增强篇

    Sublime Text 如何安装插件详见:https://packagecontrol.io/installation WordCount:可以实时显示当前文件的字数. 安装后,后下角多出字数 En ...

  8. min-width:100%和max-width:100%的区别

    1.width:100%和width:auto width:100%,设定对象的宽度占父元素的100%不论设定元素的margin值是多少,不包含margin: width:auto,根据设定对象的实际 ...

  9. CSS检测窗口大小显示和隐藏内容

    代码不多 用css写的话简单一点 @media (max-width: 1024px) { #hidden { display: none; } } max-width 是要检测的宽度

  10. oracle用NOT EXISTS替代NOT IN

    在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历).  为了避免使用NOT IN ,我们可以把它改写成外连 ...