链接:https://ac.nowcoder.com/acm/contest/1062/C

题目描述

给定一个N行M列的棋盘,已知某些格子禁止放置。

问棋盘上最多能放多少个不能互相攻击的車。

車放在格子里,攻击范围与中国象棋的“車”一致。

输入描述:

第一行包含三个整数N,M,T,其中T表示禁止放置的格子的数量。
接下来T行每行包含两个整数x和y,表示位于第x行第y列的格子禁止放置,行列数从1开始。

输出描述:

输出一个整数,表示结果。

示例1

输入

8 8 0

输出

8

思路

先分析出之前讲的 \(0/1要素\)

“1要素”

每行、每列只能放1个车(不然就能互相攻击到)。某个格子 \((i,j)\) 如果放了车,就等于占用了第 \(i\) 行与第 \(j\) 列放車的“名额”

因此,我们可以把行、列看作节点,一共\(N+M\)个节点。如果格子\((i,j)\) 没有被禁止,就在第 \(i\)行对应的节点与第 \(j\) 行对应的节点之间连无向边。

“0要素”:

每个車显然不能既在第 \(i_1\) 行又在第 $ i_2$ 行,所以两个“行”对应的节点之间没有边。对于“列”也同理。

因此,刚才构建的无向图是二分图,我们可以把N个“行节点”作为左部,M个列节点”作为右部。

更在不能互相攻击的前提下放置的车最多,就是求上述分图的最大匹配,时间复杂度为 \(O((N +M)*NM)\)。

AC代码

#include<bits/stdc++.h>
using namespace std;
int n, m, t, f[210], b[210], ans;
bool a[210][210], v[210]; bool dfs(int x) {
for (int i = 1; i <= m; ++i) {
if (v[i] || a[x][i])continue;
v[i] = 1;
if (f[i] == 0 || dfs(f[i])) {
f[i] = x; return true;
}
}
return false;
} int main() {
//freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0);
cin >> n >> m >> t;
for (int j = 1; j <= t; ++j) {
int x, y; cin >> x >> y;
a[x][y] = 1;
}
for (int i = 1; i <= n; ++i) {
memset(v, 0, sizeof v);
if (dfs(i))++ans;
}
cout << ans << endl;
}

一些匹配方法:

完备匹配:

给定一张二分图,其左部、右部点数相同,均为 \(N\) 个节点。如果该二分图的最大匹配包含 \(N\)

条匹配边,则称该二分图具有完备匹配

多重匹配:

给定一张包含 \(N\) 个左部节点、\(M\) 个右部节点的二分图。从中选出尽量多的边,使第 \(i (1 <= i <=N)\) 个左部节点至多与 \(kl_i\) 条选出的边相连,第 \(j(i <= j <= M)\) 个右部节点至多与 \(kr_j\) 条选出的边相连。该问题被称为二分图的多重匹配。

当\(kl_i=kr_j=1\) 时,上述问题就简化为二分图最大匹配。因此,多重匹配是一个广义的“匹配”问题,每个节点可以与不止一条“匹配”边相连,但不能超过一.个给定的限制。

多重匹配一般有 四种解决方案:

1.拆点。把第 $i $个左部节点拆成 \(kl_i\)个不同的左部节点,第j个右部节点拆成 \(kr_j\)个右部节点。对于原

图中的每条边 \((i,j)\), 在i拆成的所有节点与 \(j\) 拆成的所有节点之间连边。然后求解二分图最大匹配。

2.如果所有的 \(kl_i= 1\),或者所有的 \(kr_j= 1\),即只有一侧是“多重”匹配,不妨设左部是“多重”的,那么可以

直接在匈牙利算法中让每个左部节点执行 $kl_i $ 次dfs​。

3.在第2种方案中,当然也可以交换左右两部,设“右部”是多重的,修改匈牙利算法的实现,让右部

节点可以匹配 \(kr_j\)次,超过匹配次数后,就要依次尝试递归当前匹配的 \(kr_j\)个左部节点,看能否找到增广路

4.网络流。这是最一般也是最高效的解决方法。但博主尚未学习(可能以后会补上)。

0x68 - C题:車的放置的更多相关文章

  1. CH6802 車的放置 和 CH6B24 Place the Robots

    6802 車的放置 0x60「图论」例题 描述 给定一个N行M列的棋盘,已知某些格子禁止放置.问棋盘上最多能放多少个不能互相攻击的車.車放在格子里,攻击范围与中国象棋的"車"一致. ...

  2. CH6802 車的放置

    原题链接 和棋盘覆盖(题解)差不多. 将行和列看成\(n+m\)个节点,且分属两个集合,如果某个节点没有被禁止,则行坐标对应节点向列坐标对应节点连边,然后就是求二分图最大匹配了. #include&l ...

  3. AcWing P373 車的放置

    Analysis 这道题是二分图匹配,设可以放車的的地方的坐标为(i,j),则连一条i到j的有向边(注意是有向边),然后再跑匈牙利算法就好了.时间复杂度是O(nm(n+m)),在1≤n,m≤200的情 ...

  4. P3355 骑士共存问题【洛谷】(二分图最大独立集变形题) //链接矩阵存图

    展开 题目描述 在一个 n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入 对于给定的 n*n 个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可 ...

  5. 【题解】宫廷守卫 [P1263]

    [题解]宫廷守卫 [P1263] 传送门:宫廷守卫 \([P1263]\) [题目描述] 给出一个 \(n*m\) 的方格图,分别用整数 \(0,1,2\) 表示空地.陷阱.墙,空地上可以放置守卫,如 ...

  6. 总结-一本通提高篇&算竞进阶记录

    当一个人看见星空,就再无法忍受黑暗 为了点亮渐渐沉寂的星空 不想就这样退役 一定不会鸽の坑 . 一本通提高篇 . 算竞进阶 . CDQ & 整体二分 . 平衡树 . LCT . 字符串 . 随 ...

  7. TJOI2016 && HEOI2016 解题报告

    好吧我来写一波题解骗访问量QAQ 题目可以在cogs提交 bzoj4551~4456 D1T1 tree 树剖可做,然而有更简单的做法,10min搞定 维护一个并查集,时光倒流,如果当前点没有标记就把 ...

  8. 冲刺CSP-S集训考试反思+其它乱写(密码私信)

    RT.开坑. 10.1 开门黑23333. 放假回来稍困,而且感冒似乎愈加严重,导致我正常考试基本睁不开眼.一个小时勉强把题读懂,神志恍惚如斯. 看T2觉得估计又是各种推柿子堆定理的数学大题,写了个暴 ...

  9. noip2018 考前提醒!

    适应Noilinux 1.终端操作 打开终端 \(Ctrl+Alt+T\) 打开文件夹 \(cd\) +名称 新建文件夹 \(mkdir\) +名称 打开 \(vim\) 配置 \(vim ~/.vi ...

  10. 长脖子鹿放置【洛谷P5030】二分图最大独立集变形题

    题目背景 众周所知,在西洋棋中,我们有城堡.骑士.皇后.主教和长脖子鹿. 题目描述 如图所示,西洋棋的“长脖子鹿”,类似于中国象棋的马,但按照“目”字攻击,且没有中国象棋“别马腿”的规则.(因为长脖子 ...

随机推荐

  1. python中面向对象有什么特点

    一:问题 python中面向对象有什么特点? 二:回答 python同其他面向对象语言一样,有3个特征:封装.继承.重写 简单理解就是:封装:把一系列属性和操作封装到一个方法里面,这样想要实现某种效果 ...

  2. JAVA学习week3

    本周由于c++小学期作业.未能按时学习JAVA 主要复习了基本语法 hello word 输出语法 输出格式的选择,进制的转换,注释的选择 还预习了变量相关的知识点

  3. 什么是oa软件?oa软件能做什么?

    什么是OA软件? OA软件是办公自动化软件(Office Automation Software)的简称,是一种通过计算机技术,对办公业务流程进行管理和自动化处理的软件系统.它主要用于协调和管理企业内 ...

  4. excel怎么固定前几行前几列不滚动?

    在Excel中,如果你想固定前几行或前几列不滚动,可以通过以下几种方法来实现.详细的介绍如下: **固定前几行不滚动:** 1. 选择需要固定的行数.例如,如果你想要固定前3行,应该选中第4行的单元格 ...

  5. RabbitMQ高可用集群的搭建部署(Centos7)

    高可用集群架构 节点域名 操作系统 RabbitMQ版本 Erlang版本 iamdemo.tp-link.com Centos7.9 3.8.28 23.3-2 iamdemo2.tp-link.c ...

  6. com.alibaba.nacos.api.exception.NacosException

    具体异常如下: com.alibaba.nacos.api.exception.NacosException: <html><body><h1>Whitelabel ...

  7. [NOI online2022提高B] 讨论

    题目描述 有 \(n\) 个人正在打模拟赛,模拟赛有 \(n\) 道题目. 有两人都会的题目并且没有人会的题目包含另一个人时,两者之间才会讨论. (定义第 ii 个人会的题目的集合为 \(S_i\) ...

  8. 一步一步教你写kubernetes sidecar

    本文分享自华为云社区<一步一步教你写kubernetes sidecar>,作者: 张俭. 什么是sidecar? sidecar,直译为边车. 如上图所示,边车就是加装在摩托车旁来达到拓 ...

  9. 报错信息如下:出现身份验证错误。要求的函数不受支持。可能是由于CredSSP加密数据库修正。

    微软官方已出补丁包:CVE-2018-0886 的 CredSSP 更新 Windows Server 2016, all editions.Windows Server 2012 R2 Standa ...

  10. 技巧:在Excel或Word中将回车替换掉

    一.在Excel中替换 将回车替换为逗号或其他字符,如下面的屏幕截图所示. 1. 在 查找和替换 对话框中 查找内容 字段,请按 Ctrl + J 键,然后在 更换 字段中,键入所需的字符,在这种情况 ...