Accumulation Degree题解
原题传送门
题目大意:有一个树形的水系,其中有nnn个节点,有n−1n-1n−1条边。xxx,yyy两点之间的容量用c(x,y)c(x,y)c(x,y)表示。nnn个点中有一个点可以作为源点,可以不断地流出水。所有度数为111的点都为汇点,水可以从该点流出。然后求以哪个点作为源点可以使得整个水系的流量最大。
先来考虑暴力,我们取每个点为源点,然后这个就成了个有根树。
现在以第666号节点为源点
不难发现,每个点都是从它的父亲节点获得水,并流向它的儿子节点
用D[x]D[x]D[x]来表示以xxx为根的子树中,从xxx出发流向子树的最大流量
D[x]=∑y∈Son(x){min(D[y],c(x,y))y的度数>1c(x,y)y的度数=1D[x]=\sum_{y\in Son(x)}\begin{cases} min(D[y],c(x,y))& y的度数>1\\ c(x,y)& y的度数=1 \end{cases} D[x]=y∈Son(x)∑{min(D[y],c(x,y))c(x,y)y的度数>1y的度数=1
对于我们要枚举的每个源点sss,可以用树形DP求出D[x]D[x]D[x]数组
void dp(int x)
{v[x]=1;//访问标记d[x]=0;for(int i=Link[x];i;i=a[i].Next){int y=a[i].y;if(v[y]){continue ;}dp(y);int v=a[i].v;if(deg[y]==1){d[x]+=v;}else{d[x]+=min(d[y],v);}}
}
但是枚举每个根节点的复杂度是承受不了的。
此时我们就得用不那么暴力的换根法
用二次扫描与换根法代替源点的枚举
先任选一个源点为根节点,设该点为rootrootroot,用上面的函数跑一遍,得到DrootD_{root}Droot
设F[x]F[x]F[x]为把xxx作为源点的最大流量。对于我们设的根节点rootrootroot,显然有D[root]=F[root]D[root]=F[root]D[root]=F[root]
若F[x]F[x]F[x]已经知道了,则考虑其子节点yyy,F[y]F[y]F[y]分为两部分:
1.从yyy流向以yyy为根的子树的流量,已经计算并存在D[y]D[y]D[y]中了
2.从yyy沿着父亲节点的路线,流到其他的节点。
因为把xxx作为源点的总流量为F[x]F[x]F[x],从xxx流向yyy的流量为min(D[y],c(x,y))min(D[y],c(x,y))min(D[y],c(x,y)),所以从xxx流向除yyy以外的其他部分的流量就是它们的差。
因此将yyy作为源点,先流到xxx,再流向其他部分的流量就是这个差灾区和c(x,y)c(x,y)c(x,y)取最小值的结果
F[y]=D[y]+{min(F[x]−min(D[y],c(x,y)),c(x,y))x的度数>1c(x,y)x的度数=1F[y]=D[y]+\begin{cases} min\left(F[x]-min(D[y],c(x,y)),c(x,y)\right)& x的度数>1\\ c(x,y)&x的度数=1 \end{cases} F[y]=D[y]+{min(F[x]−min(D[y],c(x,y)),c(x,y))c(x,y)x的度数>1x的度数=1
F[y]F[y]F[y]就是把源点从xxx换成yyy后,流量的计算结果。
void dfs(int x)
{v[x]=1;for(int i=Link[x];i;i=a[i].Next){int y=a[i].y;if(v[y]){continue ;}int v=a[i].v;if(deg[x]==1){f[y]=d[y]+v;}else{f[y]=d[y]+min(f[x]-min(d[y],v),v);}dfs(y);}
}
最后的代码就不贴了,就是求出fff数组之后求个maxmaxmax就完事了
Accumulation Degree题解相关推荐
- 牛客网【每日一题】4月13号 Accumulation Degree
文章目录 题目描述 样例分析: 题意: 题解: 代码: 本题目传送 题目树学是这个题的简易版,也涉及换根问题,可以先看看这个 树学 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32 ...
- Accumulation Degree
Accumulation Degree 有一个有n个节点,n-1条河道的树形水系,每个河道有一个最大容水量\(c[x][y]\)表示点x到y的最大容水量,源点可以源源不断出水,以源点作为根节点的树的叶 ...
- POJ 3585 Accumulation Degree 树形dp
题目链接 Accumulation Degree Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5388 Accepte ...
- Poj·Accumulation Degree
初见安~这里是传送门:Poj P3585 Description Trees are an important component of the natural landscape because o ...
- 『树形DP·换根法』Accumulation Degree
题目描述 有一个树形的水系,由 N-1 条河道和 N 个交叉点组成. 我们可以把交叉点看作树中的节点,编号为 1~N,河道则看作树中的无向边. 每条河道都有一个容量,连接 x 与 y 的河道的容量记为 ...
- Accumulation Degree --- 换根dp
个人感觉,换根dp的实质就是在不确定答案是以哪个节点为根时,先假设1个节点为根去遍历,更新答案,接着利用数学公式推出该假设根的子儿子为根的时候对应的值. #include<iostream> ...
- 【POJ3585】Accumulation Degree 二次扫描与换根法
简单来说,这是一道树形结构上的最大流问题. 朴素的解法是可以以每个节点为源点,单独进行一次dp,时间复杂度是\(O(n^2)\) 但是在朴素求解的过程中,相当于每次都求解了一次整棵树的信息,会做了不少 ...
- [换根] Accumulation Degree
题面 link 给定一棵树,每条边有流量限制,一个结点的流量定义为将该点看为源点,最多能流出多少水(可以从不是自身的叶子结点流出),问这棵树最大的结点流量是多少? 分析 求出一个结点的流量,我 ...
- Accumulation Degree -换根dp
本代码现在在Poj上无法AC,请谨慎参考 因为这个换根比较简单,只简述一下要维护的东西: 1,每个节点维护一个weight[],表示从叶子到根的方向,这个点最多能接纳的流量. 2,边权. 所以画画图, ...
最新文章
- node 实现blog博客
- 「杂谈」那些越早知道越好的人生经验
- 删除input框type=number时,默认的上下小箭头
- 高端唯有定制,把 sublime 打造成专属的 IDE
- PE学习(十)第十章: 加载配置信息表
- android 强制全屏,[Android]设置Activity为全屏显示的两种方法
- excel二极管伏安特性曲线_【刘敏蔷老师】半导体二极管的原理及应用
- 基于RNN和CTC的语音识别模型,探索语境偏移解决之道
- chmod命令文件权限属性设置
- python访问带密码的共享文件夹_设置带密码和读写权限的共享文件夹 - Hakka
- Python笔试题汇总
- 转载--Python random模块(获取随机数)常用方法和使用例子
- ajax请求 cache,JavaScript_解析jquery中的ajax缓存问题,jquery的ajax请求默认请求cache是t - phpStudy...
- 最短路径顶点算法:最短路径之迪杰斯特拉(Dijkstra)算法Strut2教程-java教程
- 蒟蒻的数据结构乱谈(未完)
- 银行那些事儿--银行会计
- ftp列表错误或长城宽带连不上ftp的解决方法
- Xposed小白入门,动态修改IMEI实例代码
- 体验在终端——参加2012年移动开发者大会有感
- ffmpeg合并(复用)音频和视频文件,组成mp4