poj 3585 Accumulation Degree(二次扫描和换根法)
Accumulation Degree
大致题意:有一棵流量树,它的每一条边都有一个正流量,树上所有度数为一的节点都是出口,相应的树上每一个节点都有一个权值,它表示从这个节点向其他出口可以输送的最大总流量。我们的任务就是求这个最大总流量。
$ solution: $
这一道题需要仔细思考其性质,我们发现如果我们把某一个节点当做是这棵树的根,并求出了这一个点的权值,那么与它相连的节点我们也可以求出来。这是二次扫描和换根法的前提条件。现在我们详细的分析一下这一题的性质:如果我们现在有两个节点 $ i $ 和 $ j $ , $ j $ 是 $ i $ 的儿子, $ i $ 是根节点,然后我们用树形 $ DP $ 求出了 $ i $ 号结点的权值(这个过程里我们肯定会求得 $ j $ 流向 $ j $ 这可子树的流量),这样我们发现 $ j $ 的权值是可以通过 $ i $ $ O(1) $ 求出来的。因为我们已经求出了 $ j $ 流向 $ j $ 这棵子树的流量,然后只要我们求出 $ j $ 通过 $ i $ 流向其他子树的流量就可以得出 $ j $ 的权值,而这个就是用 $ i $ 的权值减去它流向 $ j $ 的流量,然后再和 $ e( i,j ) $ 这条边的流量取最小值即可。然后我们发现我们的 $ j $ 节点已经拥有了作为一个根节点的条件,所以 $ j $ 又可以当做一个新的根节点来更新其他的节点。
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define rg register int
using namespace std;
const ll inf=(ll)1e12;
ll ans;
int t,n,id,top;
ll a[200005];
ll f[200005];
int du[200005];
int tou[200005];
bool vis[200005];
struct su{
int to,v,next;
}b[400005];
inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar())) if(ch=='-')sign=1;
while(isdigit(ch)) res=res*10+(ch^48),ch=getchar();
return sign?-res:res;
}
inline ll min(ll x,int y){
if(x<y)return x;
return y;
}
inline void add(int x,int y,int v){
b[++top].to=y; b[top].v=v;
b[top].next=tou[x]; tou[x]=top;
}
inline void dfs(int i){ vis[i]=1;
if(du[i]<2){a[i]=inf;return;}
for(rg j=tou[i];j;j=b[j].next){
rg to=b[j].to; if(vis[to])continue;
dfs(to); a[i]+=min(a[to],b[j].v);
}
}
inline void upd(int i,int fa,int v){
//cout<<i<<" "<<a[i]<<endl;
a[i]+=min(a[fa]-v,v); ans=max(ans,a[i]);
for(rg j=tou[i];j;j=b[j].next){
rg to=b[j].to;
if(to==fa||du[to]<2)continue;
upd(to,i,b[j].v);
}
}
int main(){
//freopen("in.in","r",stdin);
//freopen(".out","w",stdout);
t=qr();
while(t--){
n=qr(); top=0; ans=0; id=0;
if(n<2){puts("0");continue;}
if(n<3){qr();qr();cout<<qr()<<endl;continue;}
for(rg i=1;i<=n;++i)
a[i]=f[i]=du[i]=tou[i]=vis[i]=0;
for(rg i=1;i<n;++i){
rg x=qr(),y=qr(),v=qr();
add(x,y,v); add(y,x,v);
++du[x]; ++du[y];
if(du[x]>du[id])id=x;
if(du[y]>du[id])id=y;
//cout<<x<<" "<<du[x]<<" "<<y<<" "<<du[y]<<" "<<id<<" "<<du[id]<<endl;
}dfs(id); ans=a[id];
//cout<<id<<endl;
//cout<<"root:"<<id<<endl;
for(rg i=tou[id];i;i=b[i].next)
if(du[b[i].to]>1)upd(b[i].to,id,b[i].v);
printf("%lld\n",ans);
}
return 0;
}
poj 3585 Accumulation Degree(二次扫描和换根法)的更多相关文章
- POJ3585 Accumulation Degree(二次扫描与换根法)
题目:http://poj.org/problem?id=3585 很容易想出暴力.那么就先扫一遍. 然后得到了指定一个根后每个点的子树值. 怎么转化利用一下呢?要是能找出当前点的父亲的 “ 不含当前 ...
- 【POJ3585】Accumulation Degree 二次扫描与换根法
简单来说,这是一道树形结构上的最大流问题. 朴素的解法是可以以每个节点为源点,单独进行一次dp,时间复杂度是\(O(n^2)\) 但是在朴素求解的过程中,相当于每次都求解了一次整棵树的信息,会做了不少 ...
- 题解 poj3585 Accumulation Degree (树形dp)(二次扫描和换根法)
写一篇题解,以纪念调了一个小时的经历(就是因为边的数组没有乘2 phhhh QAQ) 题目 题目大意:找一个点使得从这个点出发作为源点,流出的流量最大,输出这个最大的流量. 以这道题来介绍二次扫描和换 ...
- $Poj3585\ Accumulation Degree$ 树形$DP/$二次扫描与换根法
Poj Description 有一个树形的水系,由n-1条河道与n个交叉点组成.每条河道有一个容量,联结x与y的河道容量记为c(x,y),河道的单位时间水量不能超过它的容量.有一个结点是整个水系的发 ...
- poj - 3585(二次扫描与换根法)
周末牛客挂了个更难的,这个简单一些 #include<iostream> #include<cstring> #include<cstdio> #include&l ...
- poj3585 树形dp 二次扫描,换根法模板题
#include<iostream> #include<cstring> #include<cstdio> #include<vector> using ...
- 【51Nod1405】树上距离和 二次扫描与换根法
题目大意:给定一棵 N 个点的边权均为 1 的树,依次输出每个点到其他各个点的距离和. 题解:首先任意选定一个节点为根节点,比如 1,第一遍 dfs 遍历树求出子树大小.树上前缀和.第二遍 dfs 遍 ...
- POJ 3585 Accumulation Degree
二次扫描与换根法 用于解决无根树,对于每一个节点作为根时都要统计 做法: 1.先以任意一个节点为根,做树形DP,保存每个节点的DP值 2.然后自上而下dfs,对于每个节点考虑以他为根的最大值 #inc ...
- POJ 3585 Accumulation Degree 题解
题面 一句话题意:找一个点使得,使得从这个点出发作为源点,发出的流量最大,输出这个最大的流量 这道题是换根法+二次扫描的模板: 首先若确定1为原点,那么可以写出dp方程:当v的度是1时, g[u]+= ...
随机推荐
- python ConfigParser 学习
[安装] ConfigParser 是解析配置文件的第三方库,需要安装 pip install ConfigParser [介绍] ConfigParser 是用来读取配置文件(可以是.conf, ...
- 【Luogu】P1613跑路(倍增+Floyd)
题目链接在此 其实我看到这道题一点想法都没有 设f[i][j][k]表示用2i秒能不能从j走到k.如果可以,那j到k就可以一秒走到,它们的路径长度就是1.方程为f[i][j][k]=f[i-1][j] ...
- Spring Boot SpringSecurity5 身份验证
对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache Shiro.Spring Security). pom.xm ...
- Mac VMware Fusion Centos7 静态ip配置
一直没用mac装过虚拟机,最近因为一些原因不得不装一个,但是被这个静态ip配置把头都搞痛了(这里吐槽一下百度,我前几页都看了几遍,搜索关键字就是我现在的标题,结果都是一些抄抄抄并且不管用的攻略,最后使 ...
- POJ 1502 MPI Maelstrom [最短路 Dijkstra]
传送门 MPI Maelstrom Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5711 Accepted: 3552 ...
- cssnext下一代的css
前端技术更新迭代的速度令人咂舌,互联网+的风头刚起那几年,前端技术大多还停留在jquery阶段,按需加载还停留在seajs和requirejs的阶段,css3和H5也不过才崭露头角,但经过几年的飞速发 ...
- TOJ 4105
题意:有10万个点,10万个询问,没有更新,求L1<=L<=L2,R1<=R<=R2,有多少个, 其实转换一下:就是求一个矩形 (L1,R1) ----(L2,R2) 中有多少 ...
- java学习笔记总略
二.正文(一)Java1.接口和抽象类的区别①抽象类里可以有构造方法,而接口内不能有构造方法.②抽象类中可以有普通成员变量,而接口中不能有普通成员变量.③抽象类中可以包含非抽象的普通方法,而接口中所有 ...
- oracle内核学习总结
http://blog.csdn.net/bcbobo21cn/article/category/3092145/1
- 【spring data jpa】报错如下:Caused by: javax.persistence.EntityNotFoundException: Unable to find com.rollong.chinatower.server.persistence.entity.staff.Department with id 0
报错如下: org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find com.rollong.chi ...