首页
Python
Java
IOS
Andorid
NodeJS
JavaScript
HTML5
【
poj3585 树形dp 二次扫描,换根法模板题
】的更多相关文章
poj3585 树形dp 二次扫描,换根法模板题
#include<iostream> #include<cstring> #include<cstdio> #include<vector> using namespace std; #define maxn 200005 struct Edge{ int to,next,c; }edge[maxn<<]; int dp[maxn],f[maxn],vis[maxn],degree[maxn],head[maxn],tot; void added…
$Poj3585\ Accumulation Degree$ 树形$DP/$二次扫描与换根法
Poj Description 有一个树形的水系,由n-1条河道与n个交叉点组成.每条河道有一个容量,联结x与y的河道容量记为c(x,y),河道的单位时间水量不能超过它的容量.有一个结点是整个水系的发源地,可以源源不断地流出水,为源点.树中度为1的点是入海口,可以吸收无限多的水,为汇点.待整个水系稳定时,每条河道中的水都以单位时间固定的水量流向固定的方向.整个水系的流量就定义为源点单位时间发出的水量. 求哪个点作为源点时,整个水系的流量最大. Sol 最朴素的做法就是枚举源点,再树形DP,更新答…
题解 poj3585 Accumulation Degree (树形dp)(二次扫描和换根法)
写一篇题解,以纪念调了一个小时的经历(就是因为边的数组没有乘2 phhhh QAQ) 题目 题目大意:找一个点使得从这个点出发作为源点,流出的流量最大,输出这个最大的流量. 以这道题来介绍二次扫描和换根法 作为一道不定根的树形DP,如果直接对每个点进行DP,可能时间会炸掉 但是,优秀的二次换根和扫描法可以再O(n^2)内解决问题. 二次扫描的含义:(来自lyd 算法竞赛进阶指南) 第一次扫描:任选一个节点为根节点(我会选1)在树上进行树形DP,在回溯时,从儿子节点向父节点(从底向上)进行状态转移…
poj 3585 Accumulation Degree(二次扫描和换根法)
Accumulation Degree 大致题意:有一棵流量树,它的每一条边都有一个正流量,树上所有度数为一的节点都是出口,相应的树上每一个节点都有一个权值,它表示从这个节点向其他出口可以输送的最大总流量.我们的任务就是求这个最大总流量. \(solution:\) 这一道题需要仔细思考其性质,我们发现如果我们把某一个节点当做是这棵树的根,并求出了这一个点的权值,那么与它相连的节点我们也可以求出来.这是二次扫描和换根法的前提条件.现在我们详细的分析一下这一题的性质:如果我们现在有两个节点 $ i…
poj3585树最大流——换根法
题目:http://poj.org/problem?id=3585 二次扫描与换根法,一次dfs求出以某个节点为根的相关值,再dfs遍历一遍树,根据之前的值换根取最大值为答案. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; ],ct,d[],f[],deg[],ans,t; ]; struct N{ int to,next,w; }edge[]; void…
cf219d 基础换根法
/*树形dp换根法*/ #include<bits/stdc++.h> using namespace std; #define maxn 200005 ]; int root,n,s,t,head[maxn],tot,dp[maxn]; void init(){ memset(head,-,sizeof head); tot=; } void addedge(int u,int v,int flag){ edge[tot].to=v;edge[tot].nxt=head[u];edge[to…
UVA 10859 Placing Lamppost 树形DP+二目标最优解的求解方案
题意:给定一个无向,无环,无多重边,要求找出最少的若干点,使得,每条边之中至少有一个点上有街灯.在满足上述条件的时候将还需要满足让两个点被选择的边的数量尽量多. 题解: 对于如何求解最小的节点数目这点,实际上有些想法,“是不是应当认为来一发BFS,之后强行染色招最小的会好呢?”但是这样就会很容易发现一个误区——染色方案被强行确定了..而这个其实是不能够直接确定为两种的. 因而,应当使用树形dp.应当想将整棵树转化为一个有根树.在转换的过程当中进行动态规划: 对于每个节点,首先都必然可以选择在该点…
POJ - 3585 树上最大流 换根法
题意:给出一棵树,边上有容量限制,求以任一点作为根和源点,叶子作为汇点的最大流的最大值 首先上网络流等于找死 树形DP可以\(O(n)\)求出以某点\(u\)为根的最大流,只需设\(f[u]=\sum min(cap_{u→v},f[v])\), 这是一个自底向上的过程 其中存在\(min\)是因为\(f[v]\)不包含连向\(u\)的边,要保证合法增广, 注意如果\(v\)为叶子则直接加上\(cap_{u→v}\) 此时我们也得知\(f[v]\)是以v为根的子树的最大流 那么换根后显然以\(v…
【POJ3585】Accumulation Degree 二次扫描与换根法
简单来说,这是一道树形结构上的最大流问题. 朴素的解法是可以以每个节点为源点,单独进行一次dp,时间复杂度是\(O(n^2)\) 但是在朴素求解的过程中,相当于每次都求解了一次整棵树的信息,会做了不少的重复工作. 对于一棵子树的孩子节点和根节点之间存在着最优解的某些关联,因此可以采用自顶向下的一次 dfs 遍历求得结果. 阶段:子树大小 状态:当前子树大小的情况下,最大的流量是多少 状态转移方程:见代码 代码如下 #include <cstdio> #include <vector>…
POJ3585 Accumulation Degree(二次扫描与换根法)
题目:http://poj.org/problem?id=3585 很容易想出暴力.那么就先扫一遍. 然后得到了指定一个根后每个点的子树值. 怎么转化利用一下呢?要是能找出当前点的父亲的 “ 不含当前点的其他子树值 ” 就好了. 发现只需要把父亲的值减去 min ( 当前子树的值,该点与父亲间的边的值 ) 就行了!(因为当初这样加过) 需要注意一下的是叶节点.赋成INF或边的值都行. 特别需要注意的是第一次选的根节点在其余时候是叶节点的情况!!!!! #include<iostream> #i…