平面图完美匹配计数-FKT算法
先介绍几个概念:
环覆盖:用若干个不相交的环,覆盖所有的点。
有向偶环覆盖(Even Directed Cycle Cover,简称EDCC):环覆盖中所有的环都是偶环,并且给所有的环定向。
定理:任意两个完美匹配的方案,都对应一个有向偶环覆盖的方案。于是有(PM:prefect matching,即完美匹配)。
现在的问题是找的个数。
给每个点连出去一条边,并且要求每个点的度数为。这样可以形成一个轮换,对应置换(排列)。
设为某个矩阵,计算对的贡献。则贡献为。
问题是构造出矩阵使得只有对应着一个的时候才有贡献。
考虑给原图定向,对于有向边,钦定,如果,则。
如此定义之后:
- 如果存在,则贡献为。
- 如果对应的轮换中有个奇环,那么存在,对于任意,满足(也就是说是将轮换反向),则有和。贡献将会互相抵消。
因此只有的贡献才会被计算到。
被计算到,我们希望贡献,现在的目的是给图定向使得它满足这个条件。
接下来就是FKT算法:
- 给图建一棵生成树,生成树内的边任意定向。
- 建另一个图,中的每个点对应中的一个面,当且仅当分割着和的边不在中。显然也是一棵树。
- 从的叶子结点开始操作,调整对应的面的面上不在中的边,使得面上的顺时针的边个数为奇数。
显然通过这样操作之后内所有的面(不包括最外面的那个),面上顺时针的边的个数都为奇数。
可以证明:这样构图之后,所有的都满足:对于中的环,顺时针的边的个数都为奇数。
首先根据平面图欧拉定理,可以得知:,其中为环内(不包括环上)的点数,环内的面数,为环内的边数(不包括环上)。
设环中顺时针边的个数为,环内面的顺时针边的个数为。归纳:由得,又由于(内部每条边两边个连着一个面,它必定是其一的顺时针边),得,所以。因为(否则内部不能形成),所以。
于是,对于每个,有的贡献(为环数)(由于给行列式同时交换两行和交换两列行列式不变,给轮换重标号后,偶环能给贡献)。
梳理一下,总的过程就是:
- 跑FKT算法,给边定向。
- 搞出矩阵,算行列式。
时间复杂度是。
分类:
平面图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?