题目传送门

题意

给出一棵树,树上的边都有容量,在树上任意选一个点作为根,使得往外流(到叶节点,叶节点可以接受无限多的流量)的流量最大。

分析

首先,还是从1号点工具人开始$dfs$,可以求出$dp[i]$为点$i$向它的子树中可以获得的最大流量。

接下来考虑换根,设$f[i]$是以$i$为根节点的答案(向它的所有根节点能够发射的最大流量之和)

考虑把根从$u$换到$v$,$v$自己子树内的答案$dp[v]$肯定是在$f[v]$之内的

经过了$u-v$这条边的答案就是$min(f[u]-min(w,dp[v]),w)$

加起来就是$f[v]=dp[v]+min(f[u]-min(w,dp[v]),w)$

理解一下:$f[u]-min(w,dp[v])$是减去红圈里的贡献,也就是$u$不往$v$里面流也产生的答案。要取$min(w,dp[v])$是因为$u$真正能流进$v$子树里的流量还要受到$w$的限制

相同地,把$v$当做根之后往$u$方向流的流量也会受到$w$的限制,所以也要取$min$。

另外,特别地,还有这种情况:

(这种情况真的好难想到的说)

这种情况的话,答案就直接是$f[v]=dp[v]+w$

然而用上面的式子的话,$f[u]-min(w,dp[v])=0$,变成$f[v]=dp[v]$,是不成立的。所以需要特判一下。

然后就做

 #include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
#define N 200005
#define ll long long
#define INF 0x3f3f3f3f
int n,ans;
int dp[N],f[N];
vector<pair<int,int> >G[N];
int rd()
{
int f=,x=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+(c^);c=getchar();}
return f*x;
}
void dfs(int u,int p)
{
int tmp=;
for(int i=;i<G[u].size();i++)
{
int v=G[u][i].first,w=G[u][i].second;
if(v==p) continue;
dfs(v,u);
tmp+=min(dp[v],w);
}
if(tmp) dp[u]=tmp;
return ;
}
void dfs2(int u,int p)
{
ans=max(ans,f[u]);
for(int i=;i<G[u].size();i++)
{
int v=G[u][i].first,w=G[u][i].second;
if(v==p) continue;
if(G[u].size()==)
{
f[v]=dp[v]+w;
dfs2(v,u);
}
else
{
f[v]=dp[v]+min(w,f[u]-min(w,dp[v]));
dfs2(v,u);
}
}
}
int main()
{
int T=rd();
while(T--)
{
n=rd();
if(n==)
{//特判
puts("");
continue;
}
ans=;
memset(dp,INF,sizeof(dp));
for(int i=;i<=n;i++)
G[i].clear();
for(int i=;i<n;i++)
{
int u=rd(),v=rd(),w=rd();
G[u].push_back(make_pair(v,w));
G[v].push_back(make_pair(u,w));
}
dfs(,-);
for(int i=;i<=n;i++)
if(dp[i]==INF)
dp[i]=;//叶节点
f[]=dp[];
dfs2(,-);
printf("%d\n",ans);
}
}

Code

完啦。

POJ3585 Accumulation Degree【换根dp】的更多相关文章

  1. poj3585 Accumulation Degree(换根dp)

    传送门 换根dp板子题(板子型选手 题意: 一棵树确定源点和汇点找到最大的流量(拿出一整套最大瘤板子orz ; int head[maxn],tot; struct node { int nt,to; ...

  2. POJ3585:Accumulation Degree(换根树形dp)

    Accumulation Degree Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3425   Accepted: 85 ...

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

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

  4. poj3585 Accumulation Degree【树形DP】【最大流】

    Accumulation Degree Time Limit: 5000MS   Memory Limit: 65536K Total Submissions:3151   Accepted: 783 ...

  5. POJ3585 Accumulation Degree 【树形dp】

    题目链接 POJ3585 题解 -二次扫描与换根法- 对于这样一个无根树的树形dp 我们先任选一根进行一次树形dp 然后再扫一遍通过计算得出每个点为根时的答案 #include<iostream ...

  6. POJ 3585 Accumulation Degree【换根DP】

    传送门:http://poj.org/problem?id=3585 题意:给定一张无根图,给定每条边的容量,随便取一点使得从这个点出发作为源点,发出的流量最大,并且输出这个最大的流量. 思路:最近开 ...

  7. [算法学习] 换根dp

    换根dp 一般来说,我们做题的树都是默认 \(1\) 为根的.但是有些题目需要计算以每个节点为根时的内容. 朴素的暴力:以每个点 \(u\) 作为 \(root\) 暴力dfs下去,复杂度\(O(n^ ...

  8. [BZOJ4379][POI2015]Modernizacja autostrady[树的直径+换根dp]

    题意 给定一棵 \(n\) 个节点的树,可以断掉一条边再连接任意两个点,询问新构成的树的直径的最小和最大值. \(n\leq 5\times 10^5\) . 分析 记断掉一条边之后两棵树的直径为 \ ...

  9. 2018.10.15 NOIP训练 水流成河(换根dp)

    传送门 换根dp入门题. 貌似李煜东的书上讲过? 不记得了. 先推出以1为根时的答案. 然后考虑向儿子转移. 我们记f[p]f[p]f[p]表示原树中以ppp为根的子树的答案. g[p]g[p]g[p ...

  10. 换根DP+树的直径【洛谷P3761】 [TJOI2017]城市

    P3761 [TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速公 ...

随机推荐

  1. JAVA笔记10-抽象类

    (1)abstrac关键字类修饰的类是抽象类,用abstract修饰的方法是抽象方法: (2)含有抽象方法的类必须被定义为抽象类: (3)抽象类必须被继承,抽象方法必须被重写(或者将子类也声明为抽象类 ...

  2. 20.包含min函数的栈(python)

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). # -*- coding:utf-8 -*- class Solution: def ...

  3. os.system 的坑,'C:\Program' 不是内部或外部命令,也不是可运行的程序 或批处理文件

    首先对os.system()是执行一些系统命令,参数是以字符串的形式进行传递,如果有多个参数时,用空格隔开 例子1:cd 和 D:用空格间隔开来,代表两个参数 但一些情况空格只是字符串里面组成部分,不 ...

  4. jmeter-响应有中文时,显示乱码

    Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

  5. springfox-swagger

    swagger简介 swagger确实是个好东西,可以跟据业务代码自动生成相关的api接口文档,尤其用于restful风格中的项目,开发人员几乎可以不用专门去维护rest api,这个框架可以自动为你 ...

  6. 什么是弹性盒子 ( Flex Box)?

    ㈠什么是弹性盒子? 弹性盒子是 CSS3 的一种新的布局模式.引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列.对齐和分配空白空间. 弹性盒子由弹性容器(Flex con ...

  7. CF D. Number Of Permutations 排列

    挺水的一道题~ 拿全排列随便乘一下就好了. #include <cstdio> #include <algorithm> #define N 300004 #define ll ...

  8. less基本用法:持续归纳中

    todo 1,嵌套语法:https://www.w3cschool.cn/less/nested_directives_bubbling.html 简单来说就是可以与html一样去写css,并且会继承 ...

  9. springBoot 整合 mybatis 项目实战

    二.springBoot 整合 mybatis 项目实战   前言 上一篇文章开始了我们的springboot序篇,我们配置了mysql数据库,但是我们sql语句直接写在controller中并且使用 ...

  10. 用了 EventBus 不要多用其他的通讯功能

    EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间.组件与后台线程间的通信.主要功能是替代Intent,Handler,BroadCast