GDOI模拟 染色配对
2016-03-09 17:32
197 查看
题目大意
定义一个点的集合S为团,当且仅当对于任意S中的两个点,都有边直接连接。定义极大团表示这个集合是团,并且不存在另外一个团包含它。现在给定一副特殊的图,图中的每个点恰好属于两个极大团,给定每个点属于的两个极大团的编号,问这个图的最大匹配是多少,以及其中一种匹配方案。设图中有N个点,总共有M个极大团。数据范围
N≤2∗105,M≤2∗104题解
我们不妨将点看成边,将每个极大团看成一个点,那么对于一个点i,若他属于极大团a,b,我们就给a,b连上一条编号为i的边。之后我们都将极大团称为点。对于一个联通块,设块中有Size条边,那么这个联通块的最大匹配的上界就是⌊Size2⌋,因为一个匹配需要两条边,接下来就是要找到一种算法使得这个连通块能达到上界,可以发现的是,原问题等价于我们给每条无向边确定一个方向,最后最大化入度为偶数的点的数量。
那么我们递归这个联通块,弄出一个Dfs树,对于一条反祖边或者树上的边(u,v),我们可以强制使得这条边的方向就是v,最后再进行调整。设当前我们递归完u的子树,其中有cu条边指向了u,并且每条回到u的返祖边都已经确定了方向了。假如cu为偶数,那么我们已经达到目的了,不需要调整,假如cu为奇数,若u不是根节点,那么必然存在一条从父亲到u的边,我们可以将这条边反向,那么cu就变成偶数了。所以假如u不为根,我们总是能获得一种合法的方案使得cu为偶数。
那么对于一个连通块,假如原来有Size条边,Size为偶数,并且除根以外所有点入度均为偶数,那么根的入度也为偶数,贡献恰好为Size2,若Size为奇数,除根以外入度为偶数,但根无法调整,依然为奇数,但贡献依然恰好为⌊Size2⌋,因此这个算法是正确的。
最终若一条边i指向了点j,我们就将i塞入j的匹配列表中,输出答案时只需要将j的匹配列表中的点逐个匹配即可。
复杂度为O(M+N)。
相关文章推荐
- Apache HttpClient 4.3开发指南 实现URL重定向
- Sublime Text 3 配置浏览器预览路径 localhost
- Python多线程学习
- JavaEE_Junit_Junit对Spring注入的Service层的测试
- Sicily 1488 矩阵取数游戏
- CodeForces 630J:Divisibility 【数学】
- FPGA 竞争与冒险
- Lua中的面向对象编程
- Github——创建GitHub技术博客全攻略
- Broadcast receiver 的使用
- 全排列一个数组
- 二维码加logo demo
- WebApi说明文档插件
- vb6 winhttp 上传文件
- Activity的顶层窗体
- iosUI篇-Date Picker 和 UITool Bar 控件简单的介绍
- C++引用
- 使用boundingRectWithSize计算内容高度的坑
- cxf webservice 生成客户端代码以及调用
- UML 统一建模语言