题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. “从根出发又回到根” 减去 “mx ” . 注意dfsx里真的要改那些dp[cr],为了下一层的调用.而且还要改回来!为了其他孩子下一层的调用! 注意dfsx里真的要改那些dp[v],为了下一层的调用.而且还要改回来!为了本层的继续调用! #include<iostream> #include<cstdio> #include<cstring&g…
[BZOJ3743][Coci2015]Kamp Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的这点出发,把这K个人分别送回去. 请你回答,对于i=1~n,如果在第i个点举行聚会,司机最少需要多少时间把K个人都送回家. Input 第一行两个数,n,K. 接下来n-1行,每行三个数,x,y,z表示x到y之间有一条需要花费z时间的边. 接下来K行,每行一…
换根dp就是先任取一点为根,预处理出一些信息,然后在第二次dfs过程中进行状态的转移处理 本题难点在于任意割断一条边,求出剩下两棵子树的直径: 设割断的边为(u,v),设down[v]为以v为根的子树的直径长度,up[v]为u所在的子树的直径长度,那么down[v]就是很常规的子树直径的换根dp的求法,up[v]则要通过分情况讨论 第一种情况,组成up[v]的两条链,一条是u上方的链,一条是u下方且不属于子树v的链 第二种情况,组成up[v]的两条链都是u下方且不属于子树v的链 那么换根的过程中…
题意: 给你一棵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->…
思路其实非常简单,借用一下最大流求法即可...默认以1为根时,$f[x]$表示以$x$为根的子树最大流.转移的话分两种情况,一种由叶子转移,一种由正常孩子转移,判断一下即可.换根的时候由頂向下递推转移,很容易得知推法(不说了.唯一需要注意的换根时原来度数为1的根转移为另一个子节点时,需要特判. RE记录:???poj玄学RE,手写_min带强制同类型转换才AC,用自带的就RE.嘛,,不管了.代码奇丑无比. #include<iostream> #include<cstdio> #i…
2. 小x游世界树 (yggdrasi.pas/c/cpp) [问题描述] 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当他想前往阿瓦隆时发现那里只有圣诞节时才能到达,然而现在已经春天了,不甘心的他将自己的目的地改成了世界树,他耗费了大量的时间,终于将自己传送到了世界树下.世界树是一棵非常巨大的树,它有着许许多多的枝条以及节点,每个节点上都有一个平台.好不容易来到传说中的世界树下,小x当然要爬上去看看风景.小x每经过一…
两遍dfs一遍向下,一边向上,分别记录子树内人数a,当前点到所有点的距离b,最大值c和次大值d,最大值子树p 然后答案是2b-c #include<iostream> #include<cstdio> using namespace std; const int N=1000005; int n,m,h[N],cnt,p[N]; long long a[N],b[N],c[N],d[N]; bool v[N]; struct qwe { int ne,to,va; }e[N]; 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…
Bzoj 1131[POI2008]STA-Station (树形DP) 状态: 设\(f[i]\)为以\(i\)为根的深度之和,然后考虑从他父亲转移. 发现儿子的深度及其自己的深度\(-1\) 其余的\(+1\),记录一下\(size\)就ok了 转移: \(f[i] = f[fa] + n - 2 * size[i]\) 记忆化搜索即可. Bzoj 可能过不了,原因貌似是栈空间不足,可以去洛谷提交,我这里的解决方法是.记忆化搜索的时候用\(n\)作为开头.然后就过了. #include <i…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 一开始想到了树形DP,处理一下子树中的最小值,向上的最小值,以及子树中的最长路和向上的最长路,就可以得到答案,可以DP: 然而写着写着写不下去了,不会求向上最小值和最长路: 于是看看TJ,原来要再记录一个次长路! 然而写挫了,写不下去了... #include<iostream> #include<cstdio> #include<cstring> #inc…