Accumulation Degree

有一个有n个节点,n-1条河道的树形水系,每个河道有一个最大容水量\(c[x][y]\)表示点x到y的最大容水量,源点可以源源不断出水,以源点作为根节点的树的叶子结点可以无限接纳水,而一个节点水的流量等于流过其儿子节点的水的流量之和,儿子节点水的流量不能超过其与父亲连边的最大容水量,询问最大的源点水流量,\(n\leq 2\times 10^5\)。

显然为树形递推题,难点在根节点不定,不妨先枚举根节点,设\(f[x]\)表示以x为根节点的子树中最大的水流量,不难有

\[f[x]=\sum_{y\in son(x)}min(f[y],c[x][y])\]

边界:叶子结点f无限大,其余为0

答案:f[r],r为根节点

但是因为枚举了根节点,时间复杂度为\(O(n^2)\),所以关键在解决根节点,而对于每个根节点求出来的信息,我们并没有充分利用,借着询问常用的维护的思想,不妨设\(g[x]\)表示以x为根节点的最大水量,自然也就有

\[g[x]=f[x]+min(g[y]-min(g[y],c[x][y]),c[x][y])\]

于是求出随便一个根节点的f,然后求出所有g即可,其实这就是二次递推和换根法。

附录:

其实注意到叶子节点的特殊性,所以叶子节点的f的转移方程,需要直接转移边权,不进行大小比较,同样对于g的求法,也要判断第一次的根节点是否为叶结点,因为它不作为根节点时候,它的流量是无限大,同理当你要求的g为叶结点时,也要特判,因为此时用于转移g的节点,也就是它的父亲节点直接利用的f值为0,是不合法的,所以网上很多的代码求g时少特判一个叶子结点,所以叶子结点的g值求的是错的,但是答案显然是靠中间更优秀,于是是否特判也就无所谓了,所以以下的代码,也没有进行特判,难的为了学术的严谨,加一点常数,也告诉了我们,一道题目边界的重要性。

参考代码:

dfs:

#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
#define intmax 0x7fffffff
using namespace std;
struct point{int next,to,w;
}ar[400005];int at;
bool check[200005];
int head[200005],f[200005],g[200005],out[200005];
il int min(int,int);
void dfs(int),root(int);
il void read(int&),link(int,int,int);
int main(){int lsy;read(lsy);while(lsy--){int n;read(n),at&=0;memset(f,0,sizeof(f));memset(g,0,sizeof(g));memset(out,0,sizeof(out));memset(head,0,sizeof(head));for(int i(1),j,k,w;i<n;++i)read(j),read(k),read(w),link(j,k,w),link(k,j,w),++out[j],++out[k];dfs(1),g[1]=f[1],root(1);int ans(0);for(int i(1);i<=n;++i)if(ans<g[i])ans=g[i];printf("%d\n",ans);}return 0;
}
void root(int x){check[x]&=false;for(int i(head[x]);i;i=ar[i].next)if(check[ar[i].to]){if(out[x]==1)g[ar[i].to]=f[ar[i].to]+ar[i].w;else g[ar[i].to]=f[ar[i].to]+min(g[x]-min(ar[i].w,f[ar[i].to]),ar[i].w);//带了一些未解释的贪心/*else{if(out[ar[i].to]==1)g[ar[i].to]=f[ar[i].to]+min(g[x]-ar[i].w,ar[i].w);else g[ar[i].to]=f[ar[i].to]+min(g[x]-min(ar[i].w,f[ar[i].to]),ar[i].w);
// 实际应该打法}*/root(ar[i].to);}
}
il int min(int a,int b){return a<b?a:b;
}
void dfs(int x){check[x]|=true;for(int i(head[x]);i;i=ar[i].next)if(!check[ar[i].to]){dfs(ar[i].to);if(out[ar[i].to]==1)f[x]+=ar[i].w;else f[x]+=min(f[ar[i].to],ar[i].w);}
}
il void link(int u,int v,int w){ar[++at].to=v,ar[at].w=w;ar[at].next=head[u],head[u]=at;
}
il void read(int &x){x&=0;ri char c;while(c=getchar(),c<'0'||c>'9');while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}

bfs

#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
#define intmax 0x7fffffff
using namespace std;
struct point{int next,to,w;
}ar[400005];int at;
bool check[200005];
int T[200005],head[200005],out[200005],n,f[200005],g[200005],pa[200005],w[200005];
il void read(int&),link(int,int,int),bfs(int);
template<class free>il free Min(free,free);
int main(){int lsy;read(lsy);while(lsy--){read(n),at&=0;memset(f,0,sizeof(f));memset(g,0,sizeof(g));memset(out,0,sizeof(out));memset(head,0,sizeof(head));memset(check,0,sizeof(check));for(int i(1),j,k,l;i<n;++i)read(j),read(k),read(l),link(j,k,l),link(k,j,l),++out[j],++out[k];bfs(1);int ans(0);for(int i(1);i<=n;++i)if(g[i]>ans)ans=g[i];printf("%d\n",ans);}return 0;
}
template<class free>
il free Min(free a,free b){return a<b?a:b;
}
il void bfs(int s){int h(0),t(1);T[1]=s;while(h<t){++h,check[T[h]]|=true;for(int i(head[T[h]]);i;i=ar[i].next)if(!check[ar[i].to])T[++t]=ar[i].to,pa[ar[i].to]=T[h],w[ar[i].to]=ar[i].w;}for(int i(n);i;--i){if(out[T[i]]==1)f[pa[T[i]]]+=w[T[i]];else f[pa[T[i]]]+=Min(f[T[i]],w[T[i]]);}g[1]=f[1];for(int i(2);i<=n;++i){if(out[pa[T[i]]]==1)g[T[i]]=f[T[i]]+w[T[i]];else g[T[i]]=f[T[i]]+min(g[pa[T[i]]]-min(w[T[i]],f[T[i]]),w[T[i]]);}
}
il void link(int u,int v,int w){ar[++at].to=v,ar[at].w=w;ar[at].next=head[u],head[u]=at;
}
il void read(int &x){x&=0;ri char c;while(c=getchar(),c<'0'||c>'9');while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}

转载于:https://www.cnblogs.com/a1b3c7d9/p/10927474.html

Accumulation Degree相关推荐

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

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

  2. POJ 3585 Accumulation Degree 树形dp

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

  3. Poj·Accumulation Degree

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

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

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

  5. Accumulation Degree --- 换根dp

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

  6. Accumulation Degree题解

    原题传送门 题目大意:有一个树形的水系,其中有nnn个节点,有n−1n-1n−1条边.xxx,yyy两点之间的容量用c(x,y)c(x,y)c(x,y)表示.nnn个点中有一个点可以作为源点,可以不断 ...

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

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

  8. [换根] Accumulation Degree

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

  9. Accumulation Degree -换根dp

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

最新文章

  1. 不用羡慕BAT,自己手工也能搭建伪基站监控系统
  2. java 生产配置文件管理_JAVA基础——使用配置文件
  3. 街上第一台电子计算机是,南京信息工程大学滨江学院2009级《计算机基础》(文科)a试卷(含答案)【最新】.doc...
  4. php操作mysqli(示例代码)
  5. RemObjects SDK开发论坛
  6. window 上 shell 连接工具
  7. uniapp进行H5微信支付
  8. The RSpec Book笔记《四》Describing Code with RSpec用RSpec描述代码
  9. 48种世间哲学,其中值得借鉴的有10个
  10. Android设计之UI透明图标
  11. 水溶性CdTe/CdSe/ZnS量子点 深紫外发光光谱PL620nm-820nm
  12. Win10 schtasks 不稳定问题
  13. html加载完成 产生动作,页面加载功能设计总结
  14. GBase XDM集群服务配置
  15. 这就是2020:全球云计算十一大年度话题盘点
  16. Linux:chmod -R 777 *含义
  17. ✨数织游戏✨:Python 制作的成本一毛钱却诚意满满的小礼物!!
  18. corodva中使用高德地图web js api
  19. 学习数学建模之优化类----蒙特卡洛迭代法(自学)+多元线性回归模型(STATA学习应用)+自己听论文排版的课程2022-01-28
  20. 基于51单片机的全自动洗衣机仿真原理图程序方案设计

热门文章

  1. 对PCIE设备访问及其配置空间的一点理解
  2. springboot 资源resource文件加载优先级
  3. TensorFlow实践(16)——tf.enable_eager_execution方法
  4. invalid non-printable character U+200D
  5. 2017.05.05FreeCodeCamp前端编程之Javascript实现laohuji
  6. 文件上传upload-labs第四关
  7. 一维DOA估计之Capon算法(含程序)
  8. Ansible 下载模块get_url、解压缩模块unarchive(学习笔记十五)
  9. GLES2.0中文API-glTexImage2D
  10. 亚信实习——初来乍到