文章目录

  • 题目描述
  • 解析
  • 代码

题目描述

在一个n*n的矩阵中,有 k个格子中有杂物,现在你有一种能力,一次可以消除一行或一列格子中的杂物,问你至少需要几次可以将这些杂物全部消完。

解析

看起来像是网络流,结果竟然是二分图。。。
本题关键是模型的转化,思路有了后就变成板子了
考虑做法:
对于每一个点(x,y)(x,y)(x,y),都连一条从x到y的边,最后求最大匹配就是答案
为什么是这样?
首先,这样连边之后,每个点对应一条边,因此每条边至少要有一个点被选到,因此相当与求这个图的最小点覆盖
然后就是两个很妙的结论:

1.最小点覆盖=n-最大独立集
2.最大独立集=n-最大匹配

为什么?
(网上没有找到证明,只好自力更生了qwq)
首先,关于性质1,比较简单:对于任何一个点独立集SSS,它的补集S′S'S′都是一个合法的点覆盖(因为根据独立集的定义,不存在一条边的两个端点都在SSS中),那么要使点覆盖最小,就要使独立集最大

对于性质2,设全集为M,最大匹配的点集为P,最大独立集的点集为S,规定一个点集X的大小用|X|表示
那么最大匹配就是∣P∣/2|P|/2∣P∣/2
我们考虑分为两步证明:∣S∣<=∣M∣−∣P∣/2|S|<=|M|-|P|/2∣S∣<=∣M∣−∣P∣/2 和 ∣S∣>=∣M∣−∣P∣/2|S|>=|M|-|P|/2∣S∣>=∣M∣−∣P∣/2

  1. ∣S∣<=∣M∣−∣P∣/2|S|<=|M|-|P|/2∣S∣<=∣M∣−∣P∣/2 :比较显然,考虑在匹配中的每一对点,至少有一个点不在独立集中(因为它们互相连接),所以独立集的大小一定不会超过∣M∣−∣P∣/2|M|-|P|/2∣M∣−∣P∣/2
  2. ∣S∣>=∣M∣−∣P∣/2|S|>=|M|-|P|/2∣S∣>=∣M∣−∣P∣/2 :设最大匹配的补集为P′P'P′,那么首先P‘的所有点可以加入S(否则它们就可以匹配了),然后对于P中的每一对匹配点A、B,考虑它们一定不能同时与P′P'P′中的点有连边(否则就可以增广了,不是最大匹配),所以它们中至少一个可以加入SSS中。

证毕

有了上面的分析后,本题就变成了一个求最大匹配的板子了

代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+100;
#define ll long long
ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();};while(isdigit(c)){x=x*10+c-'0';c=getchar();};return x*f;
}
int n,m;
struct node{int to,nxt;
}p[N<<1];
int fi[N],cnt=-1;
void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;
}
int mat[N],vis[N];
bool hungry(int x,int tim){if(vis[x]==tim) return false;vis[x]=tim;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(!mat[to]||dfs(mat[to],tim)){mat[to]=x;return true;}}return false;
}
int main(){memset(fi,-1,sizeof(fi));n=read();m=read();for(int i=1;i<=m;i++){int x=read(),y=read();addline(x,y);}int res=0;for(int i=1;i<=n;i++){if(dfs(i,i)) res++;}printf("%d\n",res);return 0;
}
/*
3 4
1 1
1 3
2 2
3 2
*/

YBTOJ:消除格子(二分图匹配)相关推荐

  1. YbtOJ#573-后缀表达【二分图匹配】

    正题 题目链接:https://www.ybtoj.com.cn/contest/115/problem/2 题目大意 给出一个包含字母变量和若干种同级操作符的后缀表达式.求一个等价的表达式满足该表达 ...

  2. BZOJ 1059 - 二分图匹配

    之前一直把矩阵的元素以为是给定的\(m\)以内- 然后才发现- ​ 哔了狗了- ​ 二分图匹配咯- 如果第\(i\)行第\(j\)列是黑色,那么在代表这一行和这一列的两个节点之间连边.然后匈牙利算法跑 ...

  3. HDU 2819 Swap(二分图匹配)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=2819 [题目大意] 给出一个棋盘,由白格子和黑格子组成,可以交换棋盘的行列, 使得其主对角线为黑格 ...

  4. 【二分图匹配】矩阵游戏

    Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏--矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两 ...

  5. 棋盘游戏 (二分图匹配)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  6. Dinic二分图匹配 || Luogu P3386

    题面:[模板]二分图匹配 思路:Dinic实现二分图匹配,要建一个超级源点(S)和超级汇点(T),分别定为N+M+1和N+M+2 然后S去和N中的数建正边和反边,正边权值为1,反边权值为0:M中的数去 ...

  7. 二分图匹配匈牙利算法DFS实现

    1 /*==================================================*\ 2 | 二分图匹配(匈牙利算法DFS 实现) 3 | INIT: g[][]邻接矩阵; ...

  8. poj1274(二分图匹配)

    (一道基础的二分图匹配) 题目意思大概为N个牛和M个栅栏,一个牛和一个栅栏只能匹配一次,求最大匹配 直接套用二分图最大匹配模板即可 #include <iostream> #include ...

  9. poj2724(二分图匹配)

    题目大概意思为有部分奶酪需要处理,若两个奶酪的二进制只有一位不同,则可以一起处理,问最少需要处理几次 题目思路: 将可以一起处理的两个奶酪用边连接在一起,相当于边只连接二进制中有偶数个1的奶酪和二进制 ...

  10. 算法模板——二分图匹配

    实现功能为二分图匹配 原理:匈牙利算法,核心思想--匹配上了就配,没直接匹配上也要通过前面的腾出位置让这个匹配上(详见:趣写算法系列之--匈牙利算法) 本程序以Codevs2776为例 详见Codev ...

最新文章

  1. form表单只提交数据而不进行页面跳转的解决方案
  2. Linux 命令行网络监控工具
  3. hdu4876 深搜+(随机枚举剪枝)
  4. 【python图像处理】python绘制饼状图
  5. 本地传送命令到远程主机上执行的方法
  6. LIS(Longest Increasing Subsequence)最长上升(不下降)子序列
  7. ios main函数之前的操作_添加函数在ARM在进入main函数之前
  8. 计算机图形学(一) 视频显示设备_3_随机扫描显示器
  9. 是什么意思网络语_互联网推广是什么意思?新手网络推广怎么干?
  10. 【企业级框架整合】Springmvc+mybatis+restful+bootstrap框架整合
  11. 分享六:php脚本守护进程
  12. ❤️ 硬核玩游戏:200行代码给你整个俄罗斯方块 ❤️
  13. MyBatis实现级联查询及逆向生成
  14. 2022-2028全球与中国紫外线点固化系统市场现状及未来发展趋势
  15. Combining Character
  16. 安卓11 Sdcard文件读取权限问题
  17. postgresql之repmgr
  18. ios获取磁力计信息
  19. qt5.13.2版本安装+qt官网下载地址
  20. 在sql执行横表转换过程中,出现特殊字符‘∞’

热门文章

  1. 物理学家史蒂夫·霍金逝世,享年76岁(附图文回顾他的一生)
  2. linux运行.pak文件,使用game-to-flatpak脚本将商业Linux游戏安装程序转换为Flatpak应用程序...
  3. python 逆向生成正则表达式_用Python中的正则表达式生成lis
  4. oracle挂证多少钱一个月_惊呆,一条sql竟然把Oracle搞挂了
  5. 通达信版弘历软件指标_通达信软件指标编写基础教程,10个指标源码祝你股市一帆风顺...
  6. linux文件目录的管理,Linux文件目录管理
  7. java文件调用脚本_Java中调用文件中所有bat脚本
  8. linux把终端嵌入桌面,在Ubuntu Linux桌面上嵌入终端窗口
  9. 墨迹天气语音包_小米有品“智能AI翻译机”评测,还内置了语音助手,随身WiFi功能...
  10. docker 安装kafka_laradock 中如何安装 Laravel Dusk