「codeforces - 1284G」Seollal
给定 \(n\times m\) 的网格图,有些格子有障碍,无障碍且相邻的格子之间连边形成图。保证 \((1, 1)\) 无障碍,保证无障碍格子连通。
将网格图黑白染色,相邻格子颜色不同,\((1, 1)\) 为黑色。
构造一棵生成树,使得以 \((1, 1)\) 为根时,所有叶子都为白色。注意:即使 \((1, 1)\) 度数为 \(1\),也不能视为叶子。
拟阵交。
黑白染色后每条边最多连一个黑点。考虑构造拟阵 \(M_1 = (E, \mathcal I_1)\) 表示删除独立集中的边,黑点相邻的边数 \(\geq 2\)(注意反过来加边不能构成拟阵,删边才可以)。这里需要特判初始时是否所有黑点(当然,除了 \((1, 1)\))度数 \(\geq 2\)。
另一个拟阵 \(M_2 = (E, \mathcal I_2)\) 就可以套路地构造成图拟阵的对偶拟阵即可(删去独立集中的边,图仍然连通)。
求出最大拟阵交,检验是否为生成树。
放个参考资料,这里有一份简单的拟阵 & 拟阵交算法介绍(一个系列共四篇),更详尽的内容可移步至 2018 年集训队论文《浅谈拟阵的一些拓展及其应用 —— 江苏省淮阴中学 杨乾澜》。
几道拟阵交习题:
gym 102156D。
codechef CNNCT2。
kattis RainbowGraph(带权)。
UVA 12370(Shannon Switching Game,结论的证明可参考论文 https://www.docin.com/p-48440222.html ,其中拟阵并的部分可以回去看论文)。
以下内容可能有符号不严谨的地方,见谅。
简单写个拟阵交算法的流程:类似于二分图匹配,将所有元素分为两部,\(I\) 部表示已在拟阵交的,\(S\setminus I\) 部表示未在拟阵交的。
对于所有 \(x\in S\setminus I\),当 \(I + \{x\}\in \mathcal I_1\),建边 \(s\to x\);当 \(I + \{x\}\in \mathcal I_2\),建边 \(x\to t\)。
对于所有 \(x\in S\setminus I, y\in I\),当 \(I - \{y\} + \{x\}\in \mathcal I_1\),建边 \(y\to x\);当 \(I - \{y\} + \{x\}\in \mathcal I_2\),建边 \(x\to y\)。
那么一条 \(s\to t\) 的最短增广路翻转后,总可以得到更大的拟阵交。
如果带权,则给 \(X\) 部的点权 \(-v\),给 \(Y\) 部的点权 \(v\),跑以点权和最大为第一关键字,以边数最少为第二关键字找 \(s\to t\) 的增广路。如果直接跑 spfa(bellman-ford) 则一定是边数最少。
证明正确性分两部分:每次翻转后得到的仍是拟阵交;不存在增广路时一定是最大拟阵交。
严谨证明见论文,这里只提证明思路。
先证前一个,不妨设增广路为 \(x_0 \to y_1 \to x_1 \to \dots y_t \to x_t\)。
引入闭包算子的概念:\(cl(A) = \{x|r(A + \{x\}) = r(A)\}\)。在线代中对应张成的空间,在图论中则近似于导出子图的概念。
增广路最短等价于 \(\forall 0 < i < j \leq t, y_i \not\to x_j\),也即 \(x_j \in cl_1(I - \{y_i\})\)。
记 \(J = I - \{y_1, y_2, \dots, y_t\} + \{x_1, x_2, \dots, x_t\}\)。
如果 \(J\) 不是基,则存在一个环。取出环上 \(i\) 最小的 \(x_i\),则其他元素都 \(\in cl_1(I - y_i)\),而 \(x_i \not\in cl_1(I - y_i)\),与它们成环矛盾。
如果 \(J + \{x_0\}\) 不是基,则此时 \(x_0\) 一定在环上。而 \(x_0\not\in cl_1(I)\),一样推出矛盾。
类似地可以说明 \(\in \mathcal I_2\)。
带权的情况我也不会证,论文也没写。
再证后一个。对于任意拟阵交 \(I\) 与任意子集 \(U\),有:
\[ |I| \leq r_1(U) + r_2(S\setminus U)
\]这是因为 \(|I| = |I\cap U| + |I \cap (S\setminus U)| \leq r_1(U) + r_2(S\setminus U)\)。
如果存在 \(I, U\) 使得等号成立,则此时 \(I\) 即最大拟阵交(有点像线性规划中的对偶),此时该定理为最小最大定理。
考虑算法最后结束时,我们取 \(U\) 为所有能够到达 \(t\) 的点,并尝试说明 \(|I\cap U| = r_1(U), |I \cap (S\setminus U)| = r_2(S\setminus U)\)。
如果 \(|I\cap U| < r_1(U)\),则存在 \(x\in (U\setminus I)\) 使得 \((I\cap U) + \{x\} \in \mathcal I_1\)。
这个 \(x\) 不能满足 \(I + \{x\} \in \mathcal I_1\),否则算法还可继续。
那么存在 \(y\in (I\setminus U)\) 使得 \(I - \{y\} + \{x\}\in \mathcal I_1\)(基交换定理)。然而 \(y\not\in U\) 与 \(I - \{y\} + \{x\}\in \mathcal I_1\) 矛盾。
另一种情况类似。
带权的情况有推广的最小最大定理,详情见论文。
论文的一些其他东西:
Hall 定理竟然是拟阵并的直接推论。
“在研究中作者发现了任意的正则拟阵的基的计数都可以通过计算一个关联矩阵的行列式求得,而矩阵树定理是其中的特例。”
「codeforces - 1284G」Seollal的更多相关文章
- 「CodeForces 581D」Three Logos
BUPT 2017 Summer Training (for 16) #3A 题意 给你三个矩形,需要不重叠不留空地组成一个正方形.不存在输出-1,否则输出边长和这个正方形(A,B,C表示三个不同矩形 ...
- 「CodeForces - 50C 」Happy Farm 5 (几何)
BUPT 2017 summer training (16) #2B 题意 有一些二维直角坐标系上的整数坐标的点,找出严格包含这些点的只能八个方向走出来步数最少的路径,输出最少步数. 题解 这题要求严 ...
- 「CodeForces - 598B」Queries on a String
BUPT 2017 summer training (for 16) #1I 题意 字符串s(1 ≤ |s| ≤ 10 000),有m(1 ≤ m ≤ 300)次操作,每次给l,r,k,代表将r位置插 ...
- 「CodeForces - 717E」Paint it really, really dark gray (dfs)
BUPT 2017 summer training (for 16) #1H 题意 每个节点是黑色or白色,经过一个节点就会改变它的颜色,一开始在1节点.求一条路径使得所有点变成黑色. 题解 dfs时 ...
- 「CodeForces 476A」Dreamoon and Stairs
Dreamoon and Stairs 题意翻译 题面 DM小朋友想要上一个有 \(n\) 级台阶的楼梯.他每一步可以上 \(1\) 或 \(2\) 级台阶.假设他走上这个台阶一共用了 \(x\) 步 ...
- 「CodeForces 546B」Soldier and Badges 解题报告
CF546B Soldier and Badges 题意翻译 给 n 个数,每次操作可以将一个数 +1,要使这 n 个数都不相同, 求最少要加多少? \(1 \le n \le 3000\) 感谢@凉 ...
- 「Codeforces 79D」Password
Description 有一个 01 序列 \(a_1,a_2,\cdots,a_n\),初始时全为 \(0\). 给定 \(m\) 个长度,分别为 \(l_1\sim l_m\). 每次可以选择一个 ...
- 「Codeforces 468C」Hack it!
Description 定义 \(f(x)\) 表示 \(x\) 的各个数位之和.现在要求 \(\sum_{i=l}^rf(i)\bmod a\). 显然 ans=solve(l,r)%a; if(a ...
- 「Codeforces 724F」Uniformly Branched Trees
题目大意 如果两棵树可以通过重标号后变为完全相同,那么它们就是同构的. 将中间节点定义为度数大于 \(1\) 的节点.计算由 \(n\) 个节点,其中所有的中间节点度数都为 \(d\) 的互不同构的树 ...
随机推荐
- Word2010制作日历
原文: https://www.toutiao.com/i6494876164157342222/ 最终效果: 设置页面纸张为"横向". 选择"页面布局"选项卡 ...
- MySQL提权之启动项提权
关于MySQL的启动项提权,听其名知其意.就是将一段 VBS脚本导入到 C:\Documents and Settings\All Users\「开始」菜单\程序\启动 下,如果管理员重启了服务器, ...
- 浅谈 Java 多线程(一) --- JMM
为什么使用多线程 更多的处理器核心数(硬件的发展使 CPU 趋向于更多的核心数,如果不能充分利用,就无法显著提升程序的效率) 更快的响应时间(复杂的业务场景下,会存在许多数据一致性不强的操作,如果将这 ...
- 【代码分享】用redis+lua实现多个集合取交集并过滤,类似于: select key from set2 where key in (select key from set1) and value>=xxx
redis中的zset结构可以看成一个个包含数值的集合,或者认为是一个关系数据库中用列存储方式存储的一列. 需求 假设我有这样一个数据筛选需求,用SQL表示为: select key from set ...
- 在3G移动通信网络信令流程里获取用户电话号的一种方法(中国电信cdma2000)
首先这些关于电话号的的寻找都是在分组域进行的 然后是首先在rp接口的A11接口寻找,没有看到,于是到pi接口,研究radius协议 发现在协议里也不含有与用户电话号码mdn相关的元素 然后偶遇一篇文档 ...
- vue项目再HBuilder打包成app后,有ui模块未添加的弹窗
直接在打包后的mainifst.json的文件夹中加入标注部分,我是这样解决了的
- C++基本面试题1
#include<iostream>using namespace std;class A{public: A(char* s) :name(s), len(strlen(name.c_s ...
- vector自实现(一)
vector.h: #ifndef __Vector__H__ #define __Vector__H__ typedef int Rank; #define DEFAULT_CAPACITY 3 t ...
- golang中接口详解
package main import ( "fmt" ) type Sayer interface { say() } type Mover interface { move() ...
- 集合框架-工具类-JDK5.0特性-ForEach循环
1 package cn.itcast.p4.news.demo; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 impo ...