当前位置:网站首页>【SSL集训DAY3】控制棋盘【二分图匹配】
【SSL集训DAY3】控制棋盘【二分图匹配】
2022-08-09 22:35:00 【VL——MOESR】

思路:
我们浅推一波可以发现,每个格子看成一个点,向它能走到的点连边,然后就变成了最小覆盖问题
跑个匈牙利不成问题
c o d e code code
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int dx[8] = {
1, 1, 2, 2, -1, -1, -2, -2 };
const int dy[8] = {
2, -2, 1, -1, 2, -2, 1, -1 };
int n, m, btot, wtot;
int a[25][25], color[25][25], link[5010], dian[25][25];
bool v[100010], ma[5010][5010];
bool find(int x) {
for (int i = 1; i <= wtot; i++) {
if (ma[x][i] == 1 && !v[i]) {
v[i] = 1;
int q = link[i];
link[i] = x;
if (q == 0 || find(q))
return 1;
link[i] = q;
}
}
return 0;
}
int main() {
scanf("%d%d", &n, &m);
int x, y, p = 0;
while (cin >> x >> y) {
a[x][y] = 1;
p++;
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
if (a[i][j])
continue;
if ((i % 2 == 1 && j % 2 == 1) || (i % 2 == 0 && j % 2 == 0))
color[i][j] = 1, dian[i][j] = ++ btot;
else dian[i][j] = ++ wtot;
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (!a[i][j]) {
for (int k = 0; k < 8; k++) {
int xx = i + dx[k], yy = j + dy[k];
if (xx < 1 || xx > n || yy < 1 || yy > m || a[xx][yy])
continue;
if (color[i][j] == 1)
ma[dian[i][j]][dian[xx][yy]] = 1;
else
ma[dian[xx][yy]][dian[i][j]] = 1;
}
}
int ans = 0;
for (int i = 1; i <= btot; i++) {
memset(v, 0, sizeof(v));
if(find(i)) ans ++;
}
printf("%d", btot + wtot - ans);
return 0;
}
边栏推荐
猜你喜欢
随机推荐
如何正则匹配乱码?
函数习题(下)
力扣:279.完全平方数
CAD 截断线段
【集训DAY4】异或【字典树】
金仓数据库 KingbaseGIS 使用手册(6.4. 几何对象存取函数)
防火墙之系统防护
直播间搭建,按钮左滑出现删除等操作按钮
用哈希简单封装unordered_map和unordered_set
技术盛宴!华云数据携六大议题亮相OpenInfra Days China
完全背包理论
友元类和友元函数
力扣:518. 零钱兑换 II
Leetcode 701. 二叉搜索树中的插入操作
linux上使用docker安装redis
新增一地公布2022下半年软考报考时间
离散选择模型之Gumbel分布
【JZOF】77按之字形打印二叉树
领跑政务云,连续五年中国第一
[JZOF] 82 binary tree with a path of a certain value (1)









