computaional origami
全息算法(???)
margulis napkin problem
素数里有任意长的等差数列
xor gate Σxi
or gate(exact version) 1-π(1-xi)
or gate(approximate versiton) :Randomly pick r1,r2,…,rn, calc Σrixi
correct with probability 1/2·
AC0电路
泊松算法
两个长度为n的数组a,b,求ai*bj中第k小的数
排序a,b,二分第k个数的数值x,统计比x小的数个数
双指针扫描
2n-1宽的金字塔,除底层外每个位置是下面三个数的中位数,求塔顶数是多少
二分顶端数,转换为01序列
长度为n的序列,每个数在[1,n],m次操作,将一个区间升序排序,最后询问一次第x个数
二分,转换01序列
线段树,区间赋值,区间查询
n点,m边,有向图,每条边边权wi,求一个环使环上平均边权最大
二分平均值,边减去平均值,spfa判正环
n点m边,子图优美度=边数/点数,求最大优美程度
二分,最大权闭合子图
带权二分
解决带k限制的东西(如某东西只能用k次)
n点,m边,无向带权联通图,黑边或白边,求一颗最小权的恰有k条白色边的生成树
n<=50000,m<=100000,所有数据边权为[1,100]的正整数
对白边增加INF,最小生成树会得到一个白色尽量少树,对白边减去INF,得到白色边尽量多的树,
因此,有单调性。
给白色边增加C,C∈[-M*MaxW,M*MaxW]
如果某个c下,刚好得到k条边,就是最优解。
(注意c增加,白色边数单调不增,如555533310)
将长度为n的非负序列分割为k+l个非空子序列,每次ans+=两个序列中元素和的乘积
[APIO2014][SDOI2016]
1. O(nk) 斜率优化
2. 给每次划分加上代价c,当C=inf,只分一段,当c=0,分n段
所以有单调性,分段随c的增加而减少
Ans=Σxi^2-(每一段内任意两个数两两权值乘积)
然后斜率DP
O(nlogV)
n点树,有边权,用不超过k条边不相交的链覆盖,最小化未覆盖边长度之和+使用的链的条数*D
判断不限次数,额外代价为D时最优解的段数是否超过K,如果没有的话得到最优解。
否则,D的设置形同虚设,因为我们一定有k段。
然后就变成一个简单的二分+树上DP了
[email protected]
清华大学 何昊天
匹配中的边称为匹配边,其他为非匹配边
和匹配边相邻的为匹配点,其余为非匹配点
二分图用网络流+超级源汇解决
一般图做不到,原因:存在奇环
交错路:给出一个图和一个匹配,匹配边和非匹配边相错的路径
性质:把其中的匹配边和非匹配边取反,仍是合法匹配
增广路:两个端点都是未匹配点的交错路
取反后匹配边+1
匹配数=匹配点数/2
增广路定理:给定图和匹配,若不存在增广路,则该匹配就是极大匹配
选择公理(?)
拟阵(证明克鲁斯卡尔,证明增广路定理)
图论证法:
增广路引理:给定一张图和一个匹配,从一个未匹配点出发找不到增广路,则原图一定存在一个最大匹配,使得其不包含这个点,换句话说,我们删去这个点依然能找到原图的一个最大匹配
证明:匹配为M,存在一个未匹配点u,从u出发找不到增广路,该图有一个最大匹配M’
若u不是M’匹配点,得证
若u是M’匹配点,则构造另一个最大匹配使得u不是匹配点
对称差:(A△B=(A∪B)-(A∩B))
考虑M和M’的对称差N,这不一定是匹配,但其中仅有M的匹配边和M’中的匹配边和无关边
假设u在M中不是匹配点,所以u在N中仍然保留了在M’的匹配边,假设匹配边另一端是v1
显然v1不可能和M’中其他的匹配边相邻,但是可能和M中的匹配边相邻,假如有这样的边,假设另一端为v2
以此类推,直到走到vk,使vk除了与vk-1通过匹配边相邻外,其余邻边都是无关的边
刚才的路径不可能重复经过一个节点vi两次(否则vi在某个匹配中一定有两条边,不可能)
其次,vk!=u,否则u不是M中的未匹配点
最后vk与vk-1之间的边一定是M中的匹配边,否则u到vk就有一条M中的增广路,矛盾
现在在M’中取反u到vk,注意到这是一条交错路,所以仍然是一个匹配
增广路定理的证明:
假设图中无增广路,则从任意未匹配点出发都找不到增广路,任选一个未匹配点,删去后仍然得到原图最大匹配,删完后原匹配仍是原匹配。递归使用增广路引理,得证。
==注意到这里没有使用二分图的性质,所以对一般图仍然成立==
对于一张二分图,枚举一个集合中的每个未匹配点,直接从未匹配点开始进行DFS,如果走到另一个集合中的未匹配点,说明发现增广路,直接取反,否则通过匹配边走回原集合
根据距离定义搜索树上距离根节点的点为偶点或奇点
对于一般图:
1. 偶点到奇点都是匹配边
2. 奇点到偶点是匹配边
3. 偶点到偶点是匹配边
4. 不存在奇点到奇点的边,否则不形成交错路
偶点到偶点的边,会在搜索树上形成一个环,而且一旦穿越这条边,绕过一圈后环上的奇点都能成为偶点,那么它们将来可能延伸出更多交错路
一般图的花:
花(Blossom):搜索树上两条分叉的交错路通过偶点与偶点之间的边连成的奇数条边的环
花的问题在于,上面所有点都可以成为偶点,所以可以把花直接缩为一个偶点,称为缩花/开花(Blossom Contraction),这样搜索树的结构会更加清晰
在更复杂的图上花之间会有重叠,可谓百花齐放(笑),但注意我们的目的是化简搜索树找出增广路,所以缩花的顺序不影响,我们可以按任意顺序缩花。
实际操作中,只要遇到偶点到偶点的边马上缩花。
考虑缩花的次数,由于花上至少有三个点(奇环),所以每次缩花都会减少两个点,O(v)次缩花即可。
一般图的最大匹配
1. 从零开始枚举每个未匹配点
2. 对于一个未匹配点,按图的遍历走到另一个未访问的点x。若x是未匹配点,则已找到增广路,取反即可,否则继续拓展,走到对应的那个点,继续遍历
3. 走到访问过的奇点,直接返回
4. 略
缩花算法
花托(base):花上两条非匹配边衔接的点
形成花后,找到花托(即两个偶点在搜索树上的LCA)然后将花上的点全部缩为偶点,用并查集完成。
由于缩的点不再出现,对一棵搜索树的所有缩花操作,找花托O(V),最多O(V)次,瓶颈仍在遍历图O(E)上,再加上并查集的复杂度
以上为 带花树算法(Blossom Algorithm) O(VEα(V))
考虑优化,多路增广
对于二分图:
1. 从零匹配开始
2. 以一个集合的所有未匹配点为根,BFS建立搜索森林,每次拓展一层,找目前最短的增广路
3. 对弈另一个集合中的未匹配点,如果是搜索森林的叶子节点,则DFS返回具体增广路并取反,O(E)
4. 上述过程最多进行O(sqrt(V))轮
在前sqrt(V)轮,每一轮都找到并增广了最短的增广路,所以长度一定单调递增,那么这sqrt(V)轮后,剩余最短增广路长度最小sqrt(V)
考虑对称差
每进行一轮,最大匹配数最小增加1,所以再多执行sqrt(V)轮,就得到了最大匹配。
总复杂度O(Esqrt(V)) 这就是二分图匹配的Hopcroft-Karp算法
也就是对二分图用dinic的过程
对于一般图,用Micali-Vazirani算法多路增广达到O(Esqrt(V))
Konig定理:二分图最小点覆盖=最大匹配
证明:每条匹配边要选一个端点完成覆盖,所以最小点覆盖数不小于最大匹配数
接下来构造一个点覆盖数恰好等于最大匹配数的点覆盖:给未匹配点打标记,左侧标记点和右侧未标记点都是匹配点,所以C的大小恰好为最大匹配数
如果有边u-v未被覆盖,则u被标记v未被标记
如果u-v是匹配边,从u出发一定标记v,否则u-v是匹配边,当v匹配才可以
graph LR
A-->B
B-->G
G-->C
I-->D
D-->G
D-->H
H-->B
B-->E
B-->F
最大独立集定理:最小点覆盖数+最大独立集数=二分图定点数
在点覆盖的补集中,任意两个点之间不可能有边,否则不是匹配
**三分图**G=(V,E),V可以被划分为V1,V2,V3,满足三者∪为全集,∩为∅
两个三元组的交代表他们边集的交
如果两个三元组有交且不全等,则称这两个三元组相邻,与三元组 相邻的三元组数成为该三元组的度
记录o为G所有三元组集合,一个匹配M是o的一个子集,且满足M中不存在两个相交的三元组
o的连通子集称为三元组系列
对于G的两个匹配M和M’,Σ称为(M,M’)的交错三元组系列
如果还有{r|r∈Σ∩M}的大小等于{r|r∈Σ∩M’},则称Σ为增广三元组系列
增广路定理:M为G的最大(三分图)匹配的充要条件是G中不存在增广路
可以拓展到任意维度
拉格朗日松弛