题目: 题解: bzoj 3302 == 2447 == 2103 三倍经验 首先我们考虑枚举两个中心的位置,然后统计答案. 我们发现,一定有一部分点离第一个中心更近,另一部分点离第二个中心更近 如果将两部分点分别染成两种颜色,容易发现一定有且只有一条边两端的颜色不相同 所以我们考虑枚举这条边,然后将整个树分成两个部分,然后分别求出分开的两颗树的中心,然后把两部分的代价求和来更新答案. 容易发现这样是\(n^2\)的 然后我们回头看题目,发现有奇怪的条件:深度 <= 100 这启发了我们从深度的…
题意 题目链接 Sol 比赛结束后才调出来..不多说啥了,就是因为自己菜. 裸的up-down dp,维护一下一个点上下的直径就行,一开始还想了个假的思路写了半天.. 转移都在代码注释里 毒瘤题目卡空间 #include<bits/stdc++.h> #define Pair pair<int, int> #define MP(x, y) make_pair(x, y) #define fi first #define se second #define LL long long…
做不来--参考https://www.cnblogs.com/ezyzy/p/6784872.html #include<iostream> #include<cstdio> using namespace std; const int N=100005; int T,o,n,h[N],cnt,f[N],g[N],q[N],q1[N],l[N],l1[N]; struct qwe { int ne,to; }e[N<<1]; int read() { int r=0,f…
BZOJ3302: [Shoi2005]树的双中心 https://lydsy.com/JudgeOnline/problem.php?id=3302 分析: 朴素算法 : 枚举边,然后在两个连通块内部找到带权重心计算答案. 然后我们发现在内部找重心是方向唯一,因此可以预处理出来这个点向下走的最优儿子和次优儿子. 然后每次从上往下找重心即可. 时间复杂度\(O(n\times dep)\). 代码: #include <cstdio> #include <cstring> #inc…
[BZOJ3302][Shoi2005]树的双中心 Description Input 第一行为N,1<N<=50000,表示树的节点数目,树的节点从1到N编号.接下来N-1行,每行两个整数U,V,表示U与V之间有一条边.再接下N行,每行一个正整数,其中第i行的正整数表示编号为i的节点权值为W(I),树的深度<=100 Output 将最小的S(x,y)输出,结果保证不超过19^9 Sample Input 5 1 2 1 3 3 4 3 5 5 7 6 5 4 Sample Outpu…
SHOI2005 树的双中心 给树 \(T=(V,E)(|V|=n)\),树高为 \(h\),\(w_u(u\in V)\).求 \(x\in V,y\in V:\left(\sum_{u\in V}w_u\cdot \min(dis_{u,x},dis_{u,y})\right)_{\min}\). 数据范围:\(1\le n\le 50000\),\(1\le h\le 100\). 一眼思路:把 \(T\) 由一条边砍成 \(T_1,T_2\),\(x\) 为 \(T_1\) 重心,\(y…
[题意]给定带点权树,要求选择两个点x,y,满足所有点到这两个点中较近者的距离*点权的和最小.n<=50000,h<=100. [算法]树的重心 [题解]代码参考自:cgh_Andy 观察要求容易发现和重心的定义[所有点距离和最小]十分相似. 要把树分成两部分,于是考虑枚举割掉一条边后,在两棵树中各自找重心. 这样做得到的方案虽然不一定满足题意,但最优解一定在方案中,且不满足题意的方案一定不会比最优解小. 用树形DP求重心,总复杂度O(n^2). 观察到最大深度<=100,可以用[往子树…
BZOJ 洛谷 挺套路但并不难的一道题 \(Description\) 给定一棵\(n\)个点的树和\(K\),边权为\(1\).对于每个点\(x\),求\(S(x)=\sum_{i=1}^ndis(x,i)^K\). \(n\leq50000,\ k\leq150\). \(Solution\) 和其它求\(x^k\)的题一样,依旧用第二类斯特林数展开.(二项式定理依旧可以得到部分分,依旧不想看=-=) \[\begin{aligned}S(x)&=\sum_{i=1}^ndis(x,i)^K…
Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 3160    Accepted Submission(s): 718 Problem Description N planets are connected by M bidirectional channels that allow instant transport…
<题目链接> 题目大意: 给定一个连通图,每个点有点权,现在需要删除一条边,使得整张图分成两个连通块,问你删除这条边后,两联通块点权值和差值最小是多少. 解题分析: 删除一条边,使原连通图分成两个连通分量,所以删除的那条边必然是桥.为了得到所有的桥,我们对原图进行边双连通图缩点.然后对缩点后的新图,跑一遍树形DP,得到所有桥两端点权和的最小差值. #include <bits/stdc++.h> using namespace std; #define clr(a,b) memse…
线段树的任意一棵子树都相当于节点数与该子树相同的线段树.于是假装在树形dp即可,记忆化搜索实现,有效状态数是logn级别的. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<map> using namespace std; #define…
4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 426  Solved: 255 Description 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细 线连着两颗小星星.有一天她发现,她的饰品被破坏了,很多细线都被拆掉了.这个饰品只剩下了n?1条细线,但 通过这些细线,这颗小星星还是被串在一起,也就是这些小星星通过这些细线形成了树.小Y找到了这个饰品的…
参考:https://blog.csdn.net/heheda_is_an_oier/article/details/51131641 这个找奇偶环的dp1真是巧妙,感觉像tarjan一样 首先分情况讨论,如果没有奇环,每条边都可以删:如果有一个奇环,奇环上隋边山:否则,删被所有奇环覆盖且没被任何一个偶环覆盖的边 那么重点就是怎样找到所有的奇环和偶环 用树形dp来搞,设f[i]记录经过第i条边的奇环数,g[i]记录经过第i条边的偶环数,因为是边的编号而存的是双向边,所以dp的时候用i>>1表示…
根据最近做的几道树形dp题总结一下规律.(从这篇往前到洛谷 P1352 ) 这几道题都是在一颗树上,然后要让整棵树的节点或边 满足一种状态.然后点可以影响到相邻点的这种状态 然后求最小次数 那么要从两个维度来设计状态 第一个维度 (1)以i为根的树的所有节点都满足这种状态 (2)以i为根的树的只有i不满足这种状态 第二个维度 (1)i这个点取 (2)i这个点不取 所以就会有四种状态,不过最近几道题都是直接pass掉了其中一种 只有三种状态. 状态设计好了就很好写转移方程了,记住转移的过程中孩子一…
题意 给一棵树,你可以匹配有边相连的两个点,问你这棵树的最大匹配时多少,并且计算出有多少种最大匹配. N≤1000,其中40%的数据答案不超过 108 题解 显然的树形DP+高精. 这题是作为考试题考的,因为记得有一次考试,状态用两个数组存. 所以看到这题瞬间想到状态dp[i][0/1]代表以i为根的子树不选/选i点的最大匹配数. f[i][0/1]代表以i为根的子树中不选/选i形成最大匹配的方案数. 然后方程改了半天:而且极长所以看代码吧. TM还要加高精... (第一个点挂了,特判过的) #…
题目链接:https://vjudge.net/problem/POJ-3107 题意:求树的可能的重心,升序输出. 思路:因为学树形dp之前学过点分治了,而点分治的前提是求树的重心,所以这题就简单水了一下.用sz[u]记录子树u的大小,son[u]记录以u为根时,子结点中最大的结点数.所以: son[u]=max(son[v],n-sz[u]),前一部分son[v]好理解,对于n-sz[u],即结点u的父结点那一块的大小. AC code: #include<cstdio> #include…
2103: Fire 消防站 Time Limit: 30 Sec  Memory Limit: 259 MBSubmit: 157  Solved: 116[Submit][Status][Discuss] Description Input 共N+1行. 第一行有一个正整数N,表示区域的个数. 接下来有N-1行,每行两个整数u.v,表述区域u和区域v之间有一条道路. 最后一行有N个正整数,第i个正整数表示区域i的权值W(i). Output 包含一个正整数,为最小的S(x, y)的值. Sa…
传送门 强行安利->巨佬题解 如果只有一个点贡献答案,那么答案显然是这棵树的带权重心,这个是可以\(O(n)\)求的.一个\(O(n^2)\)暴力是枚举两个集合之间的分界边,然后对这两个集合分别算答案,合并更新 考虑优化此过程,一个结论是一棵树内,只有\(size_i*2>size_{root}\)的点才有可能成为带权重心,并且这一类点个数不超过2个 不会证啊qwq,感性理解一下吧.所以每次枚举是哪条边为分界线,然后把树分成两部分,从每个树的根开始算答案,如果\(size_i*2\le siz…
先考虑一个\(O(N^2)\)做法. 设选的两个点为\(x,y\),则一定可以将树分成两个集合\(A,B\),使得\(A\)集合所有点都去\(x\),\(B\)集合所有点都去\(y\),而这两个集合的分界点就是树上的一条边.于是考虑枚举断哪条边,然后对两边分别跑一遍带权树的重心,统计答案加起来取最小值就行了. 现在进行优化,求树的重心的方法可以参考医院设置. 以\(1\)为根建树,\(f[u]\)表示所有点到\(u\)的总距离.(人数乘以距离) 转移方程是: \[f[v]=f[u]+size[1…
题目链接:Click here Solution: 首先我们要知道,选择两个点\(A,B\),必定存在一条边,割掉这条边,两个集合分别归\(A,B\)管 再结合题目,我们就得到了一个暴力的\(n^2\)做法:枚举个每条边,分别对两棵树求带权重心,更新答案 但这显然是过不了这道题的,考虑对求带权重心的过程进行优化: 设\(d(x)\)为\(x\)所在集合内所有点到他的距离之和,\(sz(x)\)表示以\(x\)为根的子树的大小,我们可以得到: \[ d(v)=d(u)+sz(rt)-sz(v)-s…
题目链接 弱化版:https://www.cnblogs.com/SovietPower/p/8663817.html. 令\(f[x][i]\)表示\(x\)的子树中深度为\(i\)的点的个数,\(g[x][i]\)表示\(x\)子树中,满足\(u,v\)到\(LCA(u,v)\)的距离都是\(d\),且到\(x\)的距离为\(d-i\)的点对\((u,v)\)个数.(就是不以\(x\)作为三个点的中心位置,那样就没法算了) 如图 那么就可以由\(g[x][i]\)与另一棵子树的\(f[y][…
题意: 给出一个无向图,每个顶点有一个权值\(w\),一个连通分量的权值为各个顶点的权值的乘积,一个图的权值为所有连通分量权值之和. 设删除顶点\(i\)后的图\(G_i\)的权值为\(z_i\),求\(\sum i \times z_i \; mod \; 10^9 + 7\). 分析: 这里找到了一篇论文,借其中的图说明一下: 左图为原图,首先找出所有的点双连通分量(一种颜色对应一个双连通),然后重新建一个图(右图): 对每个双连通加一个点,然后对这个新点和双连通中所有的点连边(正方形对应原…
加一条边后最少还有多少个桥,先Tarjan双联通缩点, 然后建树,求出树的直径,在直径起点终点加一条边去的桥最多, #pragma comment(linker, "/STACK:1024000000,1024000000") #include<stdio.h> #include<string.h> #include<stack> #define N 200001 using namespace std; int belong[N],head[N],…
树型动态规划就是在“树”的数据结构上的动态规划,树型动态规划是建立在树上的,所以有二个方向: 1.根—>叶:这种题目基本上碰不到 2.叶->根:根的子节点传递有用的信息给根,完后根得出最优解的过程.这种的题目是树型动态规划的最常见类型. 首先定义 无根树:题目中可以以任意节点为根建树,经过动态规划后即可直接得到最优值. 有根树:必须以某一个节点为根建树才能通过动态规划后得到最优值. 基本上有这样一个步骤: 一.有根树: 1.建树(一般以递归方式实现,有时数据过大以BFS方式实现) 2.在建树中…
1405 树的距离之和 基准时间限制:1 秒 空间限制:131072 KB   收藏  关注 给定一棵无根树,假设它有n个节点,节点编号从1到n, 求任意两点之间的距离(最短路径)之和. Input 第一行包含一个正整数n (n <= 100000),表示节点个数. 后面(n - 1)行,每行两个整数表示树的边. Output 每行一个整数,第i(i = 1,2,...n)行表示所有节点到第i个点的距离之和. Input示例 4 1 2 3 2 4 2 Output示例 5 3 5 5 思路:d…
因为一大堆式子实在懒得写题解了.首先用prufer推出CF917D用到的结论,然后具体见前言不搭后语的注释. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<map> using namespace std; #define ll long…
<题目链接> 题目大意:给你一棵树,任意去除某一个点后,树被分成了几个联通块,则该点的平衡值为所有分成的连通块中,点数最大的那个,问你:该树所有点中,平衡值最小的那个点是什么? 解题分析: 运用DFS,找到以u为根节点,所有子节点数的最大值,然后求出这些最大值的最小值. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using names…
http://acm.hdu.edu.cn/showproblem.php?pid=2242 题意: 思路:首先求一下双连通分量,如果只有一个双连通分量,那么无论断哪根管子,图还是连通的. 最后只需要根据双连通分量重新建图,在树上进行dp,分成两部分的最小差值.这个具体看代码就可以了. 需要注意的是,这道题目是存在重边的,在这个点上我WA了好久,那么怎么处理重边呢? 设置一个重边标记,跳过第一次父亲结点的反向边,但是第二次的话就必须处理,此时就是双连通的了. 简单来说,如果图是没有重边的,那么我…
4169: Lmc的游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 44  Solved: 25 Description RHL有一天看到lmc在玩一个游戏. "愚蠢的人类哟,what are you doing",RHL说. "我在玩一个游戏.现在这里有一个有n个结点的有根树,其中有m个叶子结点.这m个叶子从1到m分别被给予了一个 号码,每个叶子的号码都是独一无二的.一开始根节点有一个棋子,两个玩家每次行动将棋子移动到当…
1060: [ZJOI2007]时态同步 Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数 字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点,都存在且仅 存在一条通路(通路指连接两个元件的导线序列).在电路板上存在一个特殊的元件称为“激发器”.当激发器工 作后,产生一个激励电流,通过导线传向每一个它所连接的节点.而中间节点接收到激励电流后,得到信息,并将 该激励电流传向与它连接并…