poj - 3585(二次扫描与换根法)
周末牛客挂了个更难的,这个简单一些

#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(二次扫描与换根法)的更多相关文章
- poj 3585 Accumulation Degree(二次扫描和换根法)
Accumulation Degree 大致题意:有一棵流量树,它的每一条边都有一个正流量,树上所有度数为一的节点都是出口,相应的树上每一个节点都有一个权值,它表示从这个节点向其他出口可以输送的最大总 ...
- 题解 poj3585 Accumulation Degree (树形dp)(二次扫描和换根法)
写一篇题解,以纪念调了一个小时的经历(就是因为边的数组没有乘2 phhhh QAQ) 题目 题目大意:找一个点使得从这个点出发作为源点,流出的流量最大,输出这个最大的流量. 以这道题来介绍二次扫描和换 ...
- POJ3585 Accumulation Degree(二次扫描与换根法)
题目:http://poj.org/problem?id=3585 很容易想出暴力.那么就先扫一遍. 然后得到了指定一个根后每个点的子树值. 怎么转化利用一下呢?要是能找出当前点的父亲的 “ 不含当前 ...
- $Poj3585\ Accumulation Degree$ 树形$DP/$二次扫描与换根法
Poj Description 有一个树形的水系,由n-1条河道与n个交叉点组成.每条河道有一个容量,联结x与y的河道容量记为c(x,y),河道的单位时间水量不能超过它的容量.有一个结点是整个水系的发 ...
- 【51Nod1405】树上距离和 二次扫描与换根法
题目大意:给定一棵 N 个点的边权均为 1 的树,依次输出每个点到其他各个点的距离和. 题解:首先任意选定一个节点为根节点,比如 1,第一遍 dfs 遍历树求出子树大小.树上前缀和.第二遍 dfs 遍 ...
- 【POJ3585】Accumulation Degree 二次扫描与换根法
简单来说,这是一道树形结构上的最大流问题. 朴素的解法是可以以每个节点为源点,单独进行一次dp,时间复杂度是\(O(n^2)\) 但是在朴素求解的过程中,相当于每次都求解了一次整棵树的信息,会做了不少 ...
- poj3585 树形dp 二次扫描,换根法模板题
#include<iostream> #include<cstring> #include<cstdio> #include<vector> using ...
- [LuoguP1829]Crash的文明表格(二次扫描与换根+第二类斯特林数)
Solution: 由于 \[ x^m = \sum_{i=0}^m{~m~\choose i}{~x~\brace i}i! \] 将所求的式子化成这样,挖掘其性质,考虑是否能从儿子转移(或 ...
- poj3585树最大流——换根法
题目:http://poj.org/problem?id=3585 二次扫描与换根法,一次dfs求出以某个节点为根的相关值,再dfs遍历一遍树,根据之前的值换根取最大值为答案. 代码如下: #incl ...
随机推荐
- Java面向对象----继承概念,super关键字
继承概念: 继承需要符合的关系 is-a , 父类通用更抽象,子类更特殊更具体 类之间的关系 继承体现 组合体现 实现接口体现 继承的意义 代码重用 体现不同抽象层次 extends关键字 Sup ...
- python内置函数and匿名函数
一.内置函数 什什么是内置函数? 就是python给你提供的. 拿来直接⽤用的函数, 比如print., input等等. 截⽌止 到python版本3.6.2 python⼀一共提供了了68个内置函 ...
- 洛谷P1507 NASA的食物计划
//二维费用背包 #include<bits/stdc++.h> using namespace std; ; ; ; int v1[maxn],v2[maxn],w[maxn],n,v1 ...
- 待性能改善的一个SQL
select t.*, t.rowid from tb_tk_datasakusei_ctrl t; alter table ATOMBB.TB_TK_JISSEKI_INFO_DETAIL add ...
- console.log详细介绍
console.log详细介绍 效果图: 代码如下: console.log("%c hello world!:http://www.baidu.com","color: ...
- H3C 代理ARP
- Java反射机制(四):动态代理
一.静态代理 在开始去学习反射实现的动态代理前,我们先需要了解代理设计模式,那何为代理呢? 代理模式: 为其他对象提供一种代理,以控制对这个对象的访问. 先看一张代理模式的结构图: 简单的理解代理设计 ...
- 2019-1-4-win10-uwp-win2d-CanvasVirtualControl-与-CanvasAnimatedControl
title author date CreateTime categories win10 uwp win2d CanvasVirtualControl 与 CanvasAnimatedControl ...
- java 自动关闭资源的try语句
Java 7简化资源清理(try-with-resources)自动关闭资源的try语句 自动关闭资源格式: try( )//此处多了圆括号,()圆括号内写打开资源的代码,在这里创建的对象必须实现Au ...
- P1001 A+B+C Problem
题目描述 输入三个整数 \(a,b,c\) ,计算它们的和并将结果输出. 输入格式 输入一行,三个整数 \(a,b,c\) ,每个整数之间以一个空格隔开 \((0 \le a,b,c \le 1000 ...