2199. 骑士共存问题(最小割,最大权独立集,二分图)

news2024/11/15 21:58:19

活动 - AcWing

在一个 n∗n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。

棋盘上某些方格设置了障碍,骑士不得进入。

QQ截图20200727153405.png

对于给定的 n∗n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑士,使得它们彼此互不攻击。

输入格式

第一行有 2 个正整数 n 和 m,分别表示棋盘的大小和障碍数。

接下来的 m 行给出障碍的位置。每行 2 个正整数,表示障碍的方格坐标。

输出格式

输出可以共存的最大骑士数量。

数据范围

1≤n≤200,
0≤m<n2

输入样例:
3 2
1 1
3 3
输出样例:
5

解析: 

本题是要求放最多的马使得所有马不会相互攻击,如果将所有能相互攻击的马之间连一条边,将所有奇数格作为左部节点,将所有偶数格作为右部节点,这就是一个二分图,且要求选中的点之间都不存在边,也就是求二分图的最大独立集,可以用匈牙利算法来求。

但是本题的数据比较大,用匈牙利算法会被卡常数,因此需要用更快的算法实现,可以用网络流求最大权独立集的方法来求,而 dinic 算法比匈牙利算法快很多,不用担心超时。

最大权独立集 = 总权值 − 最小权点覆盖集,因此我们需要求出最小权点覆盖集,用固定做法就行,从源点向所有左部节点连一条容量是权值的边,从所有右部节点向汇点连一条容量是权值的边,左部节点和右部节点之间的边容量是 +∞。最小割就是最小权点覆盖。

本题每个点是没有权值的,求的也是最大独立集的点数,因此可以认为每个点的权值都是 1。这样就能求出最小点覆盖的点数,对应求出最大独立集的点数,两者是互补的。

作者:小小_88
链接:https://www.acwing.com/solution/content/133616/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
#include<unordered_set>
#include<bitset>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 4e4 + 10, M = (N*8+2*N) * 2 + 10, INF = 0x3f3f3f3f;
int n, m, S, T;
int h[N], e[M], f[M], ne[M], idx;
int q[N], d[N], cur[N];
bool g[210][210];

void add(int a, int b, int c) {
	e[idx] = b, f[idx] = c, ne[idx] = h[a], h[a] = idx++;
	e[idx] = a, f[idx] = 0, ne[idx] = h[b], h[b] = idx++;
}

int get(int a, int b) {
	return (a - 1) * n + b;
}

bool bfs() {
	int hh = 0, tt = 0;
	memset(d, -1, sizeof d);
	q[0] = S, d[S] = 0, cur[S] = h[S];
	while (hh <= tt) {
		int t = q[hh++];
		for (int i = h[t]; i != -1; i = ne[i]) {
			int j = e[i];
			if (d[j] == -1 && f[i]) {
				d[j] = d[t] + 1;
				cur[j] = h[j];
				if (j == T)return 1;
				q[++tt] = j;
			}
		}
	}
	return 0;
}

int find(int u, int limit) {
	if (u == T)return limit;
	int flow = 0;
	for (int i = cur[u]; i != -1 && flow < limit; i = ne[i]) {
		int j = e[i];
		cur[u] = i;
		if (d[j] == d[u] + 1 && f[i]) {
			int t = find(j, min(f[i], limit - flow));
			if (!t)d[j] = -1;
			f[i] -= t, f[i ^ 1] += t, flow += t;
		}
	}
	return flow;
}

int dinic() {
	int ret = 0, flow = 0;
	while (bfs())while (flow = find(S, INF))ret += flow;
	return ret;
}

int main() {
	cin >> n >> m;
	memset(h, -1, sizeof h);
	S = 0, T = n * n + 1;
	for (int i = 1, a, b; i <= m; i++) {
		scanf("%d%d", &a, &b);
		g[a][b] = 1;
	}
	int tot = 0;
	int dx[] = { -1,-2,-2,-1,1,2,2,1 }, dy[] = { -2,-1,1,2,2,1,-1,-2 };
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (g[i][j])continue;
			if (i + j & 1) {
				add(S, get(i, j), 1);
				for (int k = 0; k < 8; k++) {
					int x = i + dx[k], y = j + dy[k];
					if (x > 0 && x <= n && y > 0 && y <= n&&!g[x][y]) {
						add(get(i, j), get(x, y), INF);
					}
				}
			}
			else add(get(i, j), T, 1);
			tot++;
		}
	}
	cout << tot - dinic() << endl;
	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1483887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年腾讯云优惠券_代金券_云服务器折扣券免费领取链接

腾讯云优惠代金券领取入口共三个渠道&#xff0c;腾讯云新用户和老用户均可领取8888元代金券&#xff0c;可用于云服务器等产品购买、续费和升级使用&#xff0c;阿腾云atengyun.com整理腾讯云优惠券&#xff08;代金券&#xff09;领取入口、代金券查询、优惠券兑换码使用方法…

UE5中实现后处理深度描边

后处理深度描边可以通过取得边缘深度变化大的区域进行描边&#xff0c;一方面可以用来做角色的等距内描边&#xff0c;避免了菲尼尔边缘光不整齐的问题&#xff0c;另一方面可以结合场景扫描等特效使用&#xff0c;达到更丰富的效果&#xff1a; 后来解决了开启TAA十字线和锯齿…

【go从入门到精通】go包,内置类型和初始化顺序

大家好&#xff0c;这是我给大家准备的新的一期专栏&#xff0c;专门讲golang&#xff0c;从入门到精通各种框架和中间件&#xff0c;工具类库&#xff0c;希望对go有兴趣的同学可以订阅此专栏。 go基础 。 Go文件名&#xff1a; 所有的go源码都是以 ".go" 结尾&…

latex宏包pythontex使用简明手册

文章目录 1.背景2. 基本示例2.1 hello world2.1.1 代码与输出结果2.1.2 说明2.1.3 如何编译使用了pythontex宏包的Latex文档2.1.4 如何既输出python代码又输出代码执行结果 2.2 在Latex中嵌入python变量的值2.2.1 示例代码与文档输出2.2.2 说明 2.3 在latex文档中输出控制台会话…

2.29号的复盘开始商城项目的规格如何设施的方式

第五次设计方式 我本来想的是&#xff0c;按照对于的组方式解拆分&#xff0c;通过分组处理的内存不同查询对应的手机上 出现问就是这里 对于的组相应规格相应里面有对于的价格&#xff0c;价格也就相同&#xff0c;无法进行区分 查询出来的对应的结果 还是没有办法具体拆分…

现货大宗商品发售平台搭建须知

在搭建现货大宗商品发售平台时&#xff0c;需要考虑以下关键因素&#xff1a; 目标市场分析&#xff1a;首先要明确你的平台将服务于哪些大宗商品市场&#xff0c;如农产品、金属、能源等。了解这些市场的特点、参与者、交易规则等&#xff0c;有助于你设计出更符合市场需求的…

解析/区分MOS管的三个引脚G、S、D(NMOS管和PMOS管)

MOS管的三个引脚分别是Gate&#xff08;栅极&#xff09;、Source&#xff08;源极&#xff09;和Drain&#xff08;漏极&#xff09;。以下是详细介绍&#xff1a; Gate&#xff08;栅极&#xff09;。这是控制MOS管开关的关键引脚&#xff0c;用于控制电流的流通。Source&…

pikachu验证XXE漏洞

先随便输入一个内容查看 接下来用bp抓包看下参数 有个xml参数&#xff0c;而且Content-Type: application/x-www-form-urlencoded&#xff0c;我们传入url编码后的xml内容试一下 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE foo [<!EN…

社区店选址人流量标准:如何确保充足的顾客流量

在选择社区店的位置时&#xff0c;确保充足的顾客流量是至关重要的。 作为一名开鲜奶吧5年的创业者&#xff0c;我将分享一些关于社区店选址人流量标准的关键要点&#xff0c;帮助你找到最适合的店铺位置。 1、研究人口统计学数据 了解潜在顾客的人口特征是选址的基础。通过研…

Unity3D学习之Lua热更新解决方案(二)XLua

文章目录 1 XLua概述2 xLua导入和AB包相关准备3 C#调用Lua3.1 Lua解析器3.2 文件加载重定向3.3 Lua解析器管理器3.3.1 重定向AB包内的Lua3.3.2 获得_G大表 3.4 全局变量的获取3.5 全局函数的获取3.5.1 无参无返回3.5.2 有参有返回3.5.3 多返回值3.5.4 变长参数 3.6 List和Dicti…

C 嵌入式系统设计模式 18:临界区模式

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述嵌入式并发和资源管理模式之四…

【AIGC】OpenAI推出王炸级模型sora,颠覆AI视频行业(2024)

对于OpenAI推出的Sora模型&#xff0c;我们可以进一步探讨其可能的技术细节、潜在应用以及对AI视频行业的影响。 点击以下任一云产品链接&#xff0c;跳转后登录&#xff0c;自动享有所有云产品优惠权益&#xff1a; 经过笔者亲测&#xff0c;强烈推荐腾讯云轻量应用服务器作…

前端打包部署(黑马学习笔记)

我们的前端工程开发好了&#xff0c;但是我们需要发布&#xff0c;那么如何发布呢&#xff1f;主要分为2步&#xff1a; 1.前端工程打包 2.通过nginx服务器发布前端工程 前端工程打包 接下来我们先来对前端工程进行打包 我们直接通过VS Code的NPM脚本中提供的build按钮来完…

Http基础之http协议、无状态协议、状态码、http报文、跨域-cors

Http基础 HTTP基础HTTP协议请求方法持久连接管线化 无状态协议使用Cookie状态管理 状态码1XX2XX OK200 OK204 NO Content206 Content-Range 3XX 重定向301302304307 4XX400401403404 5XX500503 HTTP报文请求报文响应报文通用首部字段Cache-ControlConnectionDate请求首部字段Ac…

Python编程小案例—利用flask查询本机IP归属并输出网页图片

Python编程小案例—利用flask查询本机IP归属并输出网页图片 环境&#xff1a;Pycharm Mac OS 源码如下&#xff1a; from flask import Flask, render_template, requestapp Flask(__name__)app.route(/) def index():return render_template(IP查询.html)if __name__ __…

还在用Jenkins?快来试试这款简而轻的自动部署软件!

最近发现了一个比 Jenkins 使用更简单的项目构建和部署工具&#xff0c;完全可以满足个人以及一些小企业的需求&#xff0c;分享一下。 Jpom 是一款 Java 开发的简单轻量的低侵入式在线构建、自动部署、日常运维、项目监控软件。 日常开发中&#xff0c;Jpom 可以解决下面这些…

STM32 DMA入门指导

什么是DMA DMA&#xff0c;全称直接存储器访问&#xff08;Direct Memory Access&#xff09;&#xff0c;是一种允许硬件子系统直接读写系统内存的技术&#xff0c;无需中央处理单元&#xff08;CPU&#xff09;的介入。下面是DMA的工作原理概述&#xff1a; 数据传输触发&am…

venv、pip、conda、anaconda、miniconda的区别和优缺点,和彻底清除python多余的环境

virtualenv(venv) 这是一个虚拟环境管理器&#xff0c;它可以让你每个项目甚至每个脚本配置一个自定义的Python解释器环境&#xff0c;这最大的好处是我可以不污染开发环境。​ pip pip 是 Python 最常用的包管理器&#xff0c;它能自动处理依赖 。 conda 如果说venv是虚拟…

5、DVWA代码审计(2)

一、csrf 1、csrf(low) 限制 复现 GET /vulnerabilities/csrf/?password_new123456&password_conf123456&ChangeChange HTTP/1.1 Host: ddd.com Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,…

探索数据宇宙:深入解析大数据分析与管理技术

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…