原题传送门
题目大意:有一个树形的水系,其中有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题解相关推荐

  1. 牛客网【每日一题】4月13号 Accumulation Degree

    文章目录 题目描述 样例分析: 题意: 题解: 代码: 本题目传送 题目树学是这个题的简易版,也涉及换根问题,可以先看看这个 树学 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32 ...

  2. Accumulation Degree

    Accumulation Degree 有一个有n个节点,n-1条河道的树形水系,每个河道有一个最大容水量\(c[x][y]\)表示点x到y的最大容水量,源点可以源源不断出水,以源点作为根节点的树的叶 ...

  3. POJ 3585 Accumulation Degree 树形dp

    题目链接 Accumulation Degree Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5388   Accepte ...

  4. Poj·Accumulation Degree

    初见安~这里是传送门:Poj P3585 Description Trees are an important component of the natural landscape because o ...

  5. 『树形DP·换根法』Accumulation Degree

    题目描述 有一个树形的水系,由 N-1 条河道和 N 个交叉点组成. 我们可以把交叉点看作树中的节点,编号为 1~N,河道则看作树中的无向边. 每条河道都有一个容量,连接 x 与 y 的河道的容量记为 ...

  6. Accumulation Degree --- 换根dp

    个人感觉,换根dp的实质就是在不确定答案是以哪个节点为根时,先假设1个节点为根去遍历,更新答案,接着利用数学公式推出该假设根的子儿子为根的时候对应的值. #include<iostream> ...

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

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

  8. [换根] Accumulation Degree

    题面 link   给定一棵树,每条边有流量限制,一个结点的流量定义为将该点看为源点,最多能流出多少水(可以从不是自身的叶子结点流出),问这棵树最大的结点流量是多少? 分析   求出一个结点的流量,我 ...

  9. Accumulation Degree -换根dp

    本代码现在在Poj上无法AC,请谨慎参考 因为这个换根比较简单,只简述一下要维护的东西: 1,每个节点维护一个weight[],表示从叶子到根的方向,这个点最多能接纳的流量. 2,边权. 所以画画图, ...

最新文章

  1. node 实现blog博客
  2. 「杂谈」那些越早知道越好的人生经验
  3. 删除input框type=number时,默认的上下小箭头
  4. 高端唯有定制,把 sublime 打造成专属的 IDE
  5. PE学习(十)第十章: 加载配置信息表
  6. android 强制全屏,[Android]设置Activity为全屏显示的两种方法
  7. excel二极管伏安特性曲线_【刘敏蔷老师】半导体二极管的原理及应用
  8. 基于RNN和CTC的语音识别模型,探索语境偏移解决之道
  9. chmod命令文件权限属性设置
  10. python访问带密码的共享文件夹_设置带密码和读写权限的共享文件夹 - Hakka
  11. Python笔试题汇总
  12. 转载--Python random模块(获取随机数)常用方法和使用例子
  13. ajax请求 cache,JavaScript_解析jquery中的ajax缓存问题,jquery的ajax请求默认请求cache是t - phpStudy...
  14. 最短路径顶点算法:最短路径之迪杰斯特拉(Dijkstra)算法Strut2教程-java教程
  15. 蒟蒻的数据结构乱谈(未完)
  16. 银行那些事儿--银行会计
  17. ftp列表错误或长城宽带连不上ftp的解决方法
  18. Xposed小白入门,动态修改IMEI实例代码
  19. 体验在终端——参加2012年移动开发者大会有感
  20. ffmpeg合并(复用)音频和视频文件,组成mp4

热门文章

  1. PS避免图片多次放大或缩小造成的模糊问题?
  2. OneNav一为主题魔改教程(四):自定义网址内容页的Tag标签到任意位置--洞五洞洞幺
  3. android usb触摸屏idc实现触摸唤醒
  4. VUE中v-for循环
  5. 通过XtraBackup进行数据库表备份和表空间传输实例
  6. Jenkins + fastlane + pgyer
  7. 主流嵌入式操作系统(RTOS)有哪些?看看这14种
  8. 辽宁启迪电商:拼多多店铺推广收费标准是什么?
  9. 同样是码农,收入差距怎么这么大呢?
  10. vue是怎么实现数据响应式的?