之前一直把矩阵的元素以为是给定的\(m\)以内… 然后才发现…

​ 哔了狗了…

​ 二分图匹配咯… 如果第\(i\)行第\(j\)列是黑色,那么在代表这一行和这一列的两个节点之间连边。然后匈牙利算法跑一遍,判断最大匹配是否是\(n\)即可。有若干种想法可以证明(伪)它的正确性。如果某一组输入对应的二分图的最大匹配是\(n\),那么它一定存在满足题意的交换方案——就把行列交换想像成节点的交换即可;反过来,如果存在满足题意的交换方案,那么就把它交换回去,可以发现仍是每一个行节点对应着一个列节点。因此,不难看出这样做的依据:原先不在同一行的两个格子,交换之后仍不会在同一行;不在同一列的同理。所以,原问题有解的充要条件就是是否有\(n\)个格子的“行和列的一一对应”,亦即行互不相同且列互不相同。这就显然是一个二分图最大基数匹配的模型了。

(为什么傻逼的我总把二分图染色的paint和匈牙利算法的match搞混…)

(还有一个小细节:是把行和列各单独建\(2n\)个点呢,还是混在一起建\(n\)个点呢?答案是都可以,——因为这是有向图,如果出现奇圈,直接环上个各点的\(bel\)值套在一起即可… 很奇怪… 所以还是分开搞吧…)

// BZOJ 1059#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;#define rep(i,a,b) for (int i=a; i<=b; i++)#define read(x) scanf("%d", &x)#define fill(a,x) memset(a, x, sizeof(a))const int N = 200+5, M=200*200+5;int T, n, x, m, pre[M], last[N], to[M], bel[2*N];bool used[2*N];void ine(int x, int y) {m++;to[m] = y; pre[m] = last[x]; last[x] = m;}#define reg(i,x) for (int i = last[x]; i; i = pre[i])void init() {m = 0;fill(last, 0);fill(bel, 0);}bool match(int x) {reg(i,x) {int y = to[i];if (used[y]) continue;used[y] = true;if (bel[y]==0 || match(bel[y])) {bel[y] = x;return true;}}return false;}int main()
{read(T);while (T--) {read(n);init();rep(i,1,n) rep(j,1,n) {read(x);if (x==1) ine(i, n+j);}bool flag = true;rep(i,1,n) {fill(used, false);if (!match(i)) { puts("No"); flag = false; break; }}if (flag) puts("Yes");}return 0;
}

转载于:https://www.cnblogs.com/yearwhk/p/5140574.html

BZOJ 1059 - 二分图匹配相关推荐

  1. bzoj 1059: [ZJOI2007]矩阵游戏(二分匹配)

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4762  Solved: 2269 [Submit][St ...

  2. BZOJ.3140.[HNOI2013]消毒(二分图匹配 匈牙利)

    题目链接 不难想到每次一定是切一片. 如果是平面,很容易想到直接做二分图匹配.对于3维的? 可以发现min(a,b,c)的最大值只有\(\sqrt[3]{n}≈17\),我们暴力枚举这一最小值代表的是 ...

  3. BZOJ 2547: [Ctsc2002]玩具兵(二分答案+二分图匹配)

    传送门 解题思路 可以发现天兵不用管,答案的一个上界是\(2*k\),就是天兵一个个换.刚开始写了个拆\(6\)点的网络流,调了半天发现自己假了..说说正解,首先可以发现交换士兵其实就是种类的交换,那 ...

  4. bzoj #1191 超级英雄(二分图匹配)

    引言 据dm说这道题比较简单? 原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1191​ 标签:二分图匹配 题意描述 [HNOI2006]超 ...

  5. BZOJ 1191: [HNOI2006]超级英雄Hero 二分图匹配

    1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4430  Solved: 2036 [Submit ...

  6. 总结 · 二分图匹配

    感觉二分图匹配的内容很杂还很难理解...需要总结一下啊..... 1.二分图最大匹配:边数最多的匹配叫做最大匹配. 算法:匈牙利算法O(V*E) 例题:BZOJ 1059 题解在这 1 #includ ...

  7. 【 HDU - 5093】Battle ships(匈牙利算法,二分图匹配)

    题干: Dear contestant, now you are an excellent navy commander, who is responsible of a tough mission ...

  8. BZOJ 1059 [ZJOI2007]矩阵游戏

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 题意:给定一个n×nn \times n的01矩阵,可以任意交换两行或两列的数字,问是否 ...

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

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

最新文章

  1. 【UVA】11991 Easy Problem from Rujia Liu? (整数v第k次出现在什么位置)
  2. strut2以及路径的一些问题
  3. linux进程与端口查看命令
  4. 自学it18大数据笔记-第三阶段Spark-day04——会持续更新……
  5. android 判断当前application 是在前台还是在后台
  6. linux内核_查看Linux内核版本
  7. 牛客小白月赛11 Rinne Loves Xor
  8. python中设置时间格式--模块datetime中日期和时间格式的参数
  9. git-bug分支-git-stash-工作代码与bug解决同时处理时解决模拟
  10. setsockopt()改善程序的健壮性
  11. 新手入门|计算机科普
  12. 函数论_E.C.Tichmarsh_Page 4 级数一致收敛的魏尔斯特拉斯 M-判别法 的推广
  13. 计算机语言中double是什么意思,C语言中double是什么意思?_后端开发
  14. 制作OpenStack xpsp3镜像
  15. 【备忘】总结一些Java学习者经常去的网站及论坛
  16. 圣诞表白html,圣诞节表白,最浪漫的表白方式
  17. 《快速像素(Quixel)》游戏“破解”攻略
  18. 用Excel表格拆分一行里的内容
  19. 或许,这是最好的一款微信公众号编辑器!
  20. android 脚本不被杀死,fgo用自动刷脚本会不会封号无需安卓

热门文章

  1. Python3字符串的编码
  2. 只要工具到位,java也可以很简单
  3. oracle 修改聚簇因子,Oracle 基础篇 --- 聚簇因子(clustering_factor)
  4. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(六)
  5. RTD-D项目总结(MATLAB)
  6. 报错“Error running ‘Tomcat 9.0.17‘: Address localhost:1099 is already in use
  7. mysql全局唯一id_Mysql实现全局唯一ID
  8. oracle ORA-12526: TNS: 监听程序: 所有适用例程都处于受限 无法使用sqlplus / as SYSDBA
  9. stm32之TIM-高级定时器应用实例二(测量频率和占空比)
  10. woocommerce分类页面模板_怎样让wordpress网站的不同分类页面,调用不同的banner图片?...