「SDFZ听课笔记」二分图&&网络流
二分图?
- 不存在奇环(长度为奇数的环)的图
- 节点能黑白染色,使得不存在同色图相连的图
这两个定义是等价哒。
直观而言,就是这样的图:
二分图有一些神奇的性质,让一些在一般图上复杂度飞天的问题可以在正常时间得到解。(这就是我们研究它的原因鸭!)
然后是一些可能会用到的定义(确实用到了 还搞得人一头懵逼QAQ
- 匹配:图中边的一个子集,使这些边没有公共顶点。
当边数最大化的时候,称这个边集为一组最大匹配。
- 独立集:图中点的一个子集,使点的导出子图中不存在边。
人话:选一些点,使得中间任意两个点之间没有边
- 覆盖:点的集合,使每条边至少跟子集中一个点关联。
人话:让图中的每条边至少有一个顶点在集合里。
- 支配集:一个神奇的点集,使每个点要么处于集合之中,要么和集合中至少一点关联
(被支配的恐惧
才讲完预备知识!惊不惊喜?!意不意外?!
求匹配的算法:
- 匈牙利算法
时间复杂度$O(NM)$,空间用邻接矩阵是$O(N^2)$,可以用邻接表优化。
- Dinic
时间复杂度$O(m\sqrt{n})$。
比匈牙利难码难理解,但是应用范围广多了(最大流算法
(会了这个还学什么匈牙利
———————————————————————————
—这里有一大段不知所云感觉没什么luan用的Hall定理—
———————————————————————————
König 定理
这个名字上风骚的两点让人忍不住觉得naïve。
这个定理就是讲了二分图的最大匹配,最大独立集,最小覆盖之间的关系。
首先设图的点数为N,最大匹配的大小为C
那么有最小覆盖=C,最大独立集=N-C
证明:
首先我们知道最小覆盖和最大独立集是对偶问题。
(把最小覆盖的点删掉,剩下来的就是最大独立集啦
然后就只要证明最小覆盖=最大匹配了
不证了,当结论记叭。(懒
其实是不会证。
EG1
有一个$n*m$的棋盘,其中有一些格子里有怪。
每次操作,可以选择一行或一列攻击,消灭这一行/列的所有怪。
求最少需要几次打掉所有怪。(1e5)
首先建一个二分图,左边$n$个点,代表行;右边$m$个点,代表列。
设这个怪所在的坐标为$(i,j)$,则把左边第$i$个点和右边第$j$个点连起来。
然后求一个最小覆盖就行啦。
EG2
有一个$n*m$的棋盘,其中有些格子放了马。
你要去掉一些马,使它们不能相互攻击。
求留下的马的最大值。(1e5)
因为马走日,所以如果两个格子能够相互攻击,也就意味着这两个格子不同色。
所以冲突必然在黑白两色之间。(阴阳之战,一触即发!
建二分图,一边黑,一边白,如果冲突就连边。
最后求最大独立集就行了。
小总结
- 以上是一些非常“简单直观”的套路。(???气哭
- 二分图是一个很强的性质,在做题的时候如果发现这是个二分图,就可以试着利用这个性质搞事情儿。
————————————
最小链覆盖
定义:在一个DAG中,选择尽可能少的链覆盖整个DAG,使每个点被覆盖至少一次。
求法:
首先给图求一个传递闭包,之后假定我们选的链两两不相交。
(传递闭包:若$i$能到$j$,且$j$能到$k$,则在$i$和$k$中间连条线。这样搞出来的图叫做原图的传递闭包。)
然后建个二分图:
把每个点$x$拆成$x^{+},x^{-}$,如果原图存在有向边$x->y$,则连边$x^{+}->y^{-}$。
eg:如果有一张$1->2->3$的图,那么它建起来的二分图↓
然后无脑求个最大匹配,设结果为$C$。
那么这张二分图的最大独立集$=$点数$-C=2N-C$//图中亮色点
结合图像想想可知,每一个点$x$拆成$x^{+},x^{-}$后,$x^{-}$是肯定会亮的。
所以原图中的的链数应该要在二分图独立集基础上$-N$,即$2N-C-N=N-C$。
结论:最小链覆盖$=$点数$-$最大匹配
怎么说呢,这个结论总感觉看着这张图就有通了六脉的觉悟,又说不出来qwq
最长反链
定义:在一个DAG中,选出一些点构成集合$S$,若对任意$x_1,x_2 \in S$,都有$x_1$走不到$x_2$,且$x_2$走不到$x_1$,那么我们说S是一个反链。
有Dilworth定理说,DAG上 最长反链的大小 等于 最小链覆盖的大小
也要用上面这张图通六脉。(还是不会证
————————————————————————
——然后就到欢欣鼓舞的网络流啦!(超开心——
————————————————————————
让我们在进入极乐净土之前回顾一下之前听到昏昏欲睡的知识:
- 二分图是一种超棒的图,有很多超棒的特性
- 我们可以用匈牙利算法或者Dinic求最大匹配
König 定理:最大匹配$=$最小覆盖$=$点数$-$最大独立集
- 最小链覆盖:先求个传递闭包,然后建二分图跑最大匹配。最小链覆盖$=$点数$-$最大匹配。
- 最长反链:任意两点都走不了的DAG,最长反链$=$最小链覆盖
都什么狗屁东西(摔
网络流
- 定义:有一个有向图,有源点S和汇点T,每条边有流量限制c。
- 最大流:一种流水的方法,使流入T的流量最大化。
- 注意在流水的过程中,除源点/汇点以外的点都是不积水的,也就是源点流出流量=汇点流入流量。
- 反向边:用来后悔的。与原边相反,初始流量为0。
- 残量网络:把图中所有流量为零的边(包括反向边)删掉,剩下来的图称为残量网络。
- 显然,只要残量网络中存在S到T的通路,那么就一定可以通过这条路使流入T的流量更大。
- 增广:我们把这样增流的操作称为增广,这条路径叫做增广路。
- 从而,一个流是最大流等价于不存在增广路,也即残量网络中S,T不连通。(Dinic中用bfs()判断能否增广的原理)
- 最小割:在初始图中割掉流量之和最小的一些边,使S,T不连通。
- 最大流最小割定理:最大流=最小割
- 证明略。(这次我是真的因为懒QAQ
算法
- EK
- 据说很好懂?入门级算法叭
- 理论复杂度$O(NM^{2})$,超慢。
- 反正我不会。
- Dinic
- 最常见的叭。
- 理论复杂度$O(MN^{2})$,但是通常(绝绝绝大多数时候)跑不到。
- 不像SPFA总是被卡,通常没人卡Dinic。$n<=1e5$的数据都随便跑。
- 反正我就会这个,这里是我的板子。
- ISAP
- 不像Dinic要跑多次bfs,ISAP只需要跑一次。
- 所以比Dinic快,但是应该(应该?)快不了多少叭。
- 反正我不会。(省选再说吧QAQ)
——————
好累啊,去做点题休息休息?QAQ
接下来就是一些题了(估计要集训完才有时间再整理了叭
我真棒。
——————
10.13UPD:自从学了这些鬼东西之后,连dp都变成网络流水题了。
这些结论是真的好用!无脑的感觉真棒qaq
「SDFZ听课笔记」二分图&&网络流的更多相关文章
- ☕【JVM技术指南】「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"【下部】
承接上文 (完结撒花1-52系列)[JVM技术指南]「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"[上部] 并行收集器 并行收集器(也称为吞吐量收集器)是类似 ...
- 「React Native笔记」在React的 setState 中操作数组和对象的多种方法(合集)
运用在React 中 setState的对象.数组的操作时是不能用类似array.push()等方法,因为push没有返回值,setState后会出现state变成Number,为了方便他人和自己查看 ...
- 「图解HTTP 笔记」Web 基础
Web 基础 三项构建技术: HTML:页面的文本标记语言 HTTP:文档传输协议 URL:指定文档所在地址 一些概念 HTTP(HyperText Transfer Protocol):通常被译为& ...
- 「刷题笔记」DP优化-状压-EX
棋盘 需要注意的几点: 题面编号都是从0开始的,所以第1行实际指的是中间那行 对\(2^{32}\)取模,其实就是\(unsigned\ int\),直接自然溢出啥事没有 棋子攻击范围不会旋转 首先, ...
- 「刷题笔记」LCA问题相关
板子 ll lg[40]; ll dep[N],fa[N][40]; ll dis[N]; void dfs(ll u,ll f) { dep[u]=dep[f]+1; fa[u][0]=f; for ...
- 「刷题笔记」Tarjan
贴一个讲得非常详细的\(tarjan\)入门教程 信息传递 讲个笑话:我之前用并查集求最小环过的这题,然后看见题目上有个\(tarjan\)标签 留下了深刻的印象:\(tarjan\)就是并查集求最小 ...
- 「刷题笔记」AC自动机
自动AC机 Keywords Research 板子题,同luoguP3808,不过是多测. 然后多测不清空,\(MLE\)两行泪. 板子放一下 #include<bits/stdc++.h&g ...
- 「刷题笔记」哈希,kmp,trie
Bovine Genomics 暴力 str hash+dp 设\(dp[i][j]\)为前\(i\)组匹配到第\(j\)位的方案数,则转移方程 \[dp[i][j+l]+=dp[i-1][j] \] ...
- Python(三)基础篇之「模块&面向对象编程」
[笔记]Python(三)基础篇之「模块&面向对象编程」 2016-12-07 ZOE 编程之魅 Python Notes: ★ 如果你是第一次阅读,推荐先浏览:[重要公告]文章更新. ...
随机推荐
- 【OpenGL】OpenGL帧缓存对象(FBO:Frame Buffer Object) 【转】
http://blog.csdn.net/xiajun07061225/article/details/7283929/ OpenGL Frame BufferObject(FBO) Overview ...
- Java HashMap学习笔记
1.HashMap数据结构 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外.HashMap实际 ...
- [Algorithm] Write a Depth First Search Algorithm for Graphs in JavaScript
Depth first search is a graph search algorithm that starts at one node and uses recursion to travel ...
- 赵雅智_Fragment
当我们须要动态的多界面切换的时候,就须要将UI元素和Activity融合成一个模块. 在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个界面动态改变.在4.0或以上系统中就能 ...
- background-attachment
CreateTime--2017年9月28日10:58:58 Author:Marydon background-attachment 1.定义 定义背景图片随滚动轴的移动方式(设置背景图像是否固 ...
- 纯JS设置首页,增加收藏,获取URL參数,解决中文乱码
雪影工作室版权全部,转载请注明[http://blog.csdn.net/lina791211] 1.前言 纯Javascript 设置首页,增加收藏. 2.设置首页 // 设置为主页 functio ...
- c语言-递推算法1
递推算法之一:倒推法 1.一般分析思路: if 求解初始条件F1 then begin { 倒推 } 由题意(或递推关系)确定最终结果Fn; 求出倒推关系式Fi-1 =G(Fi ); i=n; { 从 ...
- .NET 4.0 WCF WebConfig aspNetCompatibilityEnabled 属性
近来被一个问题困扰了好久,好好的一个WCF后台服务,在发布机器上可用.在自己机器上没法跑起来. 一直提示兼容性问题,后来在网上找来解决方案,但问题依旧.没办法又从客户的服务器上重新把配置内容 拿下来审 ...
- 版本控制器 git
摘要:版本控制器是码农必备的工具,很多常用的,像svn,git,cvs等,工作中用过svn,Tortoisehg,firefly,其实大同小异,现在简单介绍下git,以及它的一些常用命令. 在wind ...
- HDU 1247 Hat’s Words(字典树变形)
题目链接:pid=1247" target="_blank">http://acm.hdu.edu.cn/showproblem.php? pid=1247 Pro ...