平面图完美匹配计数-FKT算法

参考文献:http://basics.sjtu.edu.cn/~dominik/teaching/2016-cs214/presentation-slides/2016-12-27-PerfectMatchingsInPlanarGraphs-PlusOne.pdf


先介绍几个概念:

环覆盖:用若干个不相交的环,覆盖所有的点。

有向偶环覆盖(Even Directed Cycle Cover,简称EDCC):环覆盖中所有的环都是偶环,并且给所有的环定向。

定理:任意两个完美匹配的方案,都对应一个有向偶环覆盖的方案。于是有|PM|2=|EDCC|(PM:prefect matching,即完美匹配)。

现在的问题是找EDCC的个数。


给每个点连出去一条边,并且要求每个点的度数为1。这样可以形成一个轮换,对应置换(排列)π

A为某个矩阵,计算πdet(A)的贡献。则贡献为sgn(π)val(π)=sgn(π)Ai,π(i)

问题是构造出矩阵使得只有π对应着一个EDCC的时候才有贡献。

考虑给原图定向,对于有向边(u,v),钦定Au,v=1,Av,u=1,如果(u,v)E,则Au,v=0

如此定义A之后:

  1. 如果存在(i,π(i))E,则贡献为0
  2. 如果π对应的轮换中有个奇环C,那么存在π,对于任意iC,满足π(π(i))=i(也就是说ππ将轮换C反向),则有sgn(π)=sgn(π)val(π)=val(π)。贡献将会互相抵消。

因此只有EDCC的贡献才会被计算到。


被计算到,我们希望贡献sgn(π)val(π)=1,现在的目的是给图定向使得它满足这个条件。

接下来就是FKT算法:

  1. 给图G建一棵生成树T,生成树内的边任意定向。
  2. 建另一个图G2G2中的每个点对应G中的一个面,(u,v)EG2当且仅当分割着uv的边不在ET中。显然G2也是一棵树。
  3. G2的叶子结点开始操作,调整对应G的面的面上不在T中的边,使得面上的顺时针的边个数为奇数。

显然通过这样操作之后G内所有的面(不包括最外面的那个),面上顺时针的边的个数都为奇数。

可以证明:这样构图之后,所有的EDCC都满足:对于EDCC中的环,顺时针的边的个数都为奇数。

首先根据平面图欧拉定理,可以得知:e=v+f1,其中v为环内(不包括环上)的点数,f环内的面数,e为环内的边数(不包括环上)。

设环中顺时针边的个数为c,环内面的顺时针边的个数为ci。归纳:由ci1(mod2)fci(mod2),又由于cic+e(内部每条边两边个连着一个面,它必定是其一的顺时针边),得fc+ec+v+f1(mod2),所以cv1(mod2)。因为2|v(否则内部不能形成EDCC),所以c1(mod2)

于是,对于每个EDCC,有sgn(π)val(π)=((1)(1))k=1的贡献(k为环数)(由于给行列式同时交换两行和交换两列行列式不变,给轮换重标号后,偶环能给sgn(π)贡献1)。


梳理一下,总的过程就是:

  1. 跑FKT算法,给边定向。
  2. 搞出矩阵A,算行列式。

时间复杂度是O(n3)

posted @   jz_597  阅读(1323)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示