随笔分类 -  树形问题

摘要:题意: 给出一棵n个点的树,每条边有边权。对这个树加边变成一个完全图。新加的边的权值为边上两点在树上的距离。求完全图上任意两点的最大流之和。 题解: 一共有C(n,2)个点对。假设当前求s到t之间的最大流,也就是最小割。那么割完之后会是2个连通块,且连通块内部是完全图。 因为是最小割,所以被割掉的边 阅读全文
posted @ 2018-08-07 01:06 Pneuis 阅读(329) 评论(0) 推荐(0)
摘要:题意: 给出一棵树以及m,a,b,x0,y0。之后加m条边{(x1,LCA(x1,y1)),(x2,LCA(x2,y2))...(xm,LCA(xm,ym))}。定义z = f(0)^f(1)^...^f(n-1),其中f(i)代表删掉点i的连通块数。则xi = (axi-1+byi-1+z)%n, 阅读全文
posted @ 2018-05-30 13:18 Pneuis 阅读(179) 评论(0) 推荐(0)
摘要:题意: 给出一颗带点权的树。q次询问,每次询问给出点u,v。在两点路径上选出一些点,使其点权异或和最大。 题解: 倍增的合并树上的线性基。对于每次询问,将路径上的点倍增的合并。最后贪心的从高位开始取最大值。 #include <bits/stdc++.h> using namespace std; 阅读全文
posted @ 2018-05-25 19:20 Pneuis 阅读(266) 评论(0) 推荐(0)
摘要:题意: 给出一棵树,删掉其中一些边,要求生成的每个子树节点数一样。输出所有可以删掉的边数。 题解: 以节点1为根,预处理每个子树的大小。对于每个n的因数x,还需满足子树为他倍数的点够n/x个,那么删的边数就为n/x-1。 #include <bits/stdc++.h> using namespac 阅读全文
posted @ 2018-05-12 17:15 Pneuis 阅读(423) 评论(0) 推荐(0)
摘要:题意: 给出一颗有点权和边权的树。求每一个点u的子树中有多少点v,使得点v到点u的距离小于等于点v的权值。 题解: 对于每一个点,倍增的预处理出他的祖宗节点及距离。根据预处理的结果求出每个点能到的最远的祖宗节点。 设点u能到的最远祖宗节点为v。利用差分的思想在点tree[u]+1,点tree[v]- 阅读全文
posted @ 2018-04-21 14:34 Pneuis 阅读(256) 评论(0) 推荐(0)