poj3585 Accumulation Degree[树形DP换根]】的更多相关文章

思路其实非常简单,借用一下最大流求法即可...默认以1为根时,$f[x]$表示以$x$为根的子树最大流.转移的话分两种情况,一种由叶子转移,一种由正常孩子转移,判断一下即可.换根的时候由頂向下递推转移,很容易得知推法(不说了.唯一需要注意的换根时原来度数为1的根转移为另一个子节点时,需要特判. RE记录:???poj玄学RE,手写_min带强制同类型转换才AC,用自带的就RE.嘛,,不管了.代码奇丑无比. #include<iostream> #include<cstdio> #i…
题意: 给你一棵n个顶点的树,有n-1条边,每一条边有一个容量z,表示x点到y点最多能通过z容量的水. 你可以任意选择一个点,然后从这个点倒水,然后水会经过一些边流到叶节点从而流出.问你最多你能倒多少容量的水 示例: A(1)= 11 + 5 + 8 = 24详情:1-> 2 111-> 4-> 3 51-> 4-> 5 8(因为1-> 4的容量为13)A(2)= 5 + 6 = 11详细信息:2-> 1-> 4-> 3 52-> 1->…
Poj Description 有一个树形的水系,由n-1条河道与n个交叉点组成.每条河道有一个容量,联结x与y的河道容量记为c(x,y),河道的单位时间水量不能超过它的容量.有一个结点是整个水系的发源地,可以源源不断地流出水,为源点.树中度为1的点是入海口,可以吸收无限多的水,为汇点.待整个水系稳定时,每条河道中的水都以单位时间固定的水量流向固定的方向.整个水系的流量就定义为源点单位时间发出的水量. 求哪个点作为源点时,整个水系的流量最大. Sol 最朴素的做法就是枚举源点,再树形DP,更新答…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. “从根出发又回到根” 减去 “mx ” . 注意dfsx里真的要改那些dp[cr],为了下一层的调用.而且还要改回来!为了其他孩子下一层的调用! 注意dfsx里真的要改那些dp[v],为了下一层的调用.而且还要改回来!为了本层的继续调用! #include<iostream> #include<cstdio> #include<cstring&g…
换根dp就是先任取一点为根,预处理出一些信息,然后在第二次dfs过程中进行状态的转移处理 本题难点在于任意割断一条边,求出剩下两棵子树的直径: 设割断的边为(u,v),设down[v]为以v为根的子树的直径长度,up[v]为u所在的子树的直径长度,那么down[v]就是很常规的子树直径的换根dp的求法,up[v]则要通过分情况讨论 第一种情况,组成up[v]的两条链,一条是u上方的链,一条是u下方且不属于子树v的链 第二种情况,组成up[v]的两条链都是u下方且不属于子树v的链 那么换根的过程中…
2. 小x游世界树 (yggdrasi.pas/c/cpp) [问题描述] 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当他想前往阿瓦隆时发现那里只有圣诞节时才能到达,然而现在已经春天了,不甘心的他将自己的目的地改成了世界树,他耗费了大量的时间,终于将自己传送到了世界树下.世界树是一棵非常巨大的树,它有着许许多多的枝条以及节点,每个节点上都有一个平台.好不容易来到传说中的世界树下,小x当然要爬上去看看风景.小x每经过一…
Accumulation Degree Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3425   Accepted: 859 题目链接:http://poj.org/problem?id=3585 Description: Trees are an important component of the natural landscape because of their prevention of erosion an…
写一篇题解,以纪念调了一个小时的经历(就是因为边的数组没有乘2 phhhh QAQ) 题目 题目大意:找一个点使得从这个点出发作为源点,流出的流量最大,输出这个最大的流量. 以这道题来介绍二次扫描和换根法 作为一道不定根的树形DP,如果直接对每个点进行DP,可能时间会炸掉 但是,优秀的二次换根和扫描法可以再O(n^2)内解决问题. 二次扫描的含义:(来自lyd 算法竞赛进阶指南) 第一次扫描:任选一个节点为根节点(我会选1)在树上进行树形DP,在回溯时,从儿子节点向父节点(从底向上)进行状态转移…
本题属于不定根的树形DP,若以每个节点为根求解一次,复杂度太高,所以可以用换根的技巧. d[u]表示以u为根向下可以流的最大流量,这个是比较好求的,直接遍历到叶子节点,由子节点信息更新父节点.然后进行第二次遍历,从上往下,子节点的信息由父节点更新. 这就是换根法的基本思路. 本题转移方程还是比较好想的,画图分析一下就行了. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using names…
题目传送门 题意 给出一棵树,树上的边都有容量,在树上任意选一个点作为根,使得往外流(到叶节点,叶节点可以接受无限多的流量)的流量最大. 分析 首先,还是从1号点工具人开始$dfs$,可以求出$dp[i]$为点$i$向它的子树中可以获得的最大流量. 接下来考虑换根,设$f[i]$是以$i$为根节点的答案(向它的所有根节点能够发射的最大流量之和) 考虑把根从$u$换到$v$,$v$自己子树内的答案$dp[v]$肯定是在$f[v]$之内的 经过了$u-v$这条边的答案就是$min(f[u]-min(…
传送门 换根dp板子题(板子型选手 题意: 一棵树确定源点和汇点找到最大的流量(拿出一整套最大瘤板子orz ; int head[maxn],tot; struct node { int nt,to;long long w; }q[*maxn]; long long dp[maxn];int cnt[maxn]; void insert(int u,int v,long long w) { q[tot].nt=head[u];q[tot].w=w;q[tot].to=v;head[u]=tot+…
Accumulation Degree Time Limit: 5000MS   Memory Limit: 65536K Total Submissions:3151   Accepted: 783 Description Trees are an important component of the natural landscape because of their prevention of erosion and the provision of a specific ather-sh…
题目链接 POJ3585 题解 -二次扫描与换根法- 对于这样一个无根树的树形dp 我们先任选一根进行一次树形dp 然后再扫一遍通过计算得出每个点为根时的答案 #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define LL long long int #define Redge(u) for (int k =…
题面 \(\text{Solution:}\) 有些题目不仅让我们做树型 \(\text{dp}\) ,而且还让我们换每个根分别做一次, 然后这样就愉快的 \(\text{TLE}\) 了,所以我们要用一种方法快速知道所有根的答案. 二次扫描与换根法: 就是先选任意点作根做一遍 \(\text{dp}\) ,求出相关信息,然后再从根往下 \(\text{dfs}\) ,对每一个节点往下走之前进行自顶向下的推导,计算出 "换根" 后的解. 就这题而言就是用父亲的换根后的答案来跟新自己换根…
链接: https://www.acwing.com/problem/content/289/ 题意: 有一个树形的水系,由 N-1 条河道和 N 个交叉点组成. 我们可以把交叉点看作树中的节点,编号为 1~N,河道则看作树中的无向边. 每条河道都有一个容量,连接 x 与 y 的河道的容量记为 c(x,y). 河道中单位时间流过的水量不能超过河道的容量. 有一个节点是整个水系的发源地,可以源源不断地流出水,我们称之为源点. 除了源点之外,树中所有度数为 1 的节点都是入海口,可以吸收无限多的水,…
链接: https://nanti.jisuanke.com/t/41403 题意: State Z is a underwater kingdom of the Atlantic Ocean. This country is amazing. There are nn cities in the country and n-1n−1 undirected underwater roads which connect all cities. In order to save energy and…
题目:http://poj.org/problem?id=3585 很容易想出暴力.那么就先扫一遍. 然后得到了指定一个根后每个点的子树值. 怎么转化利用一下呢?要是能找出当前点的父亲的 “ 不含当前点的其他子树值 ” 就好了. 发现只需要把父亲的值减去 min ( 当前子树的值,该点与父亲间的边的值 ) 就行了!(因为当初这样加过) 需要注意一下的是叶节点.赋成INF或边的值都行. 特别需要注意的是第一次选的根节点在其余时候是叶节点的情况!!!!! #include<iostream> #i…
[POI2008]Sta Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1889  Solved: 729[Submit][Status][Discuss] Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. Output 输出你所找到的点,如果具有多个解,请输出编号最小的那个. Sample Input 8 1 4…
/*树形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…
传送门:http://poj.org/problem?id=3585 题意:给定一张无根图,给定每条边的容量,随便取一点使得从这个点出发作为源点,发出的流量最大,并且输出这个最大的流量. 思路:最近开始做树形DP这部分的题,发现存图部分不是太会,这道题需要用到邻接表存图,不熟悉的朋友可以见我的另一篇博客:https://blog.csdn.net/weixin_43820920/article/details/98610704 言归正传,这道题算是换根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…
Accumulation Degree 大致题意:有一棵流量树,它的每一条边都有一个正流量,树上所有度数为一的节点都是出口,相应的树上每一个节点都有一个权值,它表示从这个节点向其他出口可以输送的最大总流量.我们的任务就是求这个最大总流量. \(solution:\) 这一道题需要仔细思考其性质,我们发现如果我们把某一个节点当做是这棵树的根,并求出了这一个点的权值,那么与它相连的节点我们也可以求出来.这是二次扫描和换根法的前提条件.现在我们详细的分析一下这一题的性质:如果我们现在有两个节点 $ i…
传送门:http://codeforces.com/contest/1092/problem/F F. Tree with Maximum Cost time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given a tree consisting exactly of nn vertices. Tree is a…
问题描述 BZOJ2591 LG3047 题解 换根树形DP. 设 \(opt[i][j]\) 代表 当 \(1\) 为根时,\(i\) 为根的子树中,到 \(i\) 的距离为 \(j\) 的权值和 . 此时我们就可以得到 \(1\) 号结点的答案. 考虑这样做 \(n\) 遍,可以求出答案,但是会T飞掉. 观察每次暴力DP,发现大部分结点的信息还是相同的,这是优化复杂度的关键所在. 考虑换根. 从 \(x\) 号结点转移到 \(y\) 号节点上,发现只有 \(x,y\) 两个结点的信息被改变了…
题面 题解 先解决第一个子问题吧,它才是难点 Subtask_1 我们可以先用一个简单的树形DP处理出每棵树内部的dis和,记为dp0[i], 然后再用一个换根的树形DP处理出每棵树内点 i 到树内每个点的距离和,记为dp[i], 好,现在分两个连通块跟三个连通块两种情况讨论 两个连通块 把两棵树A,B合并到一起,我们得先确定两个连接的点, 若其分别为 i,j,不难发现答案就是 dp0[A] + dp0[B] + dp[i] * size[B] + dp[j] * size[A] + size[…
链接 题意:n个充电元件形成一棵树,每个点和每条边都有各自的充电概率,元件可以自身充电或者通过其他点和边间接充电,求充电状态元件的期望个数 题解 设1为根节点 设 \(f[x]\) 表示 \(x\) 不从以 \(x\) 为根的子树中充电的概率 ,前提自己不充电,再乘上儿子不充电或者边不充电的概率,因此有 \[ f[x]=(1-w[x])\prod(1-(1-f[y])\times w(x,y)) \] 这样进行第一次DP 再设 \(g[x]\) 表示 \(x\) 不充电的概率,他的前提是 \(f…
http://codeforces.com/contest/1187/problem/E 分析:问得分最高,实际上就是问以哪个节点出发得到的分数最多,而呈现成代码形式就变成了换根,max其得分!!!而要利用之前算过的得分来求. #include<bits/stdc++.h> using namespace std; typedef long long ll; ; vector<int>e[M]; int son[M]; ll ans; int n; void dfs(int u,i…
换根dp 一般来说,我们做题的树都是默认 \(1\) 为根的.但是有些题目需要计算以每个节点为根时的内容. 朴素的暴力:以每个点 \(u\) 作为 \(root\) 暴力dfs下去,复杂度\(O(n^2)\): 正确的做法:换根dp,复杂度\(O(n)\). 执行步骤 第一次扫描,先默认 \(root=1\) ,跑一遍 \(dfs\): 第二次扫描,从 \(root=1\) 开始,每次从 \(u\) 到 \(v\) 节点时,计算根从 \(u\) 转移到 \(v\) 时的贡献变化. 很显然,换根d…
[BZOJ3677][Apio2014]连珠线 Description 在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做“连珠线”.不出所料,玩这个游戏只需要珠子和线,珠子从1到礼编号,线分为红色和蓝色.游戏开始时,只有1个珠子,而接下来新的珠子只能通过线由以下两种方式被加入: 1.Append(w,杪):-个新的珠子w和一个已有的珠子杪连接,连接使用红线. 2.Insert(w,u,v):-个新的珠子w加入到一对通过红线连接的珠子(u,杪)之间,并将红线改成蓝线.也就是将原来u连到1的红线…
Problem Description Acesrc is a famous tourist at Nanjing University second to none. During this summer holiday, he, along with Zhang and Liu, is going to travel to Hong Kong. There are n spots in Hong Kong, and n−1 bidirectional sightseeing bus rout…