当前位置: 首页 > news >正文

第三章 图论 No.11二分图,匈牙利算法与点覆盖

文章目录

    • 二分+染色:257. 关押罪犯
    • 增广路径
      • 372. 棋盘覆盖
    • 最小点覆盖
      • 376. 机器任务
    • 最大独立集
      • 378. 骑士放置
    • 最小路径点覆盖

image.png

二分+染色:257. 关押罪犯

257. 关押罪犯 - AcWing题库
image.png

最大最小问题,一眼二分
答案的范围在 [ 1 , 1 e 9 ] [1, 1e9] [1,1e9]之间,二分答案,check(mid)
check:将所有权值大于mid的边进行二分,若能得到二分图,返回true,否则返回false
最终将得到最优解ans,所有大于ans的边组成的图为二分图,若是图中有边的权值小于ans,那么这个图就不是二分图
当ans为0时,说明原图就是一张二分图,此时的答案也为0,不需要特判,所以二分的区间为 [ 0 , 1 e 9 ] [0, 1e9] [0,1e9]

#include <iostream>
#include <cstring>
using namespace std;const int N = 20010, M = 2e5 + 10;
int h[N], e[M], ne[M], w[M], idx;
int color[N];
int n, m;void add(int x, int y, int d)
{e[idx] = y, ne[idx] = h[x], w[idx] = d, h[x] = idx ++ ;
}bool dfs(int x, int c, int mid)
{color[x] = c;for (int i = h[x]; i != -1; i = ne[i]){if (w[i] <= mid) continue;int y = e[i];if (!color[y]){if (!dfs(y, 3 - c, mid)) return false;}else if (color[y] == c) return false;}return true;
}bool check(int mid)
{memset(color, 0, sizeof(color));for (int i = 1; i <= n; ++ i )if (!color[i])if (!dfs(i, 1, mid))return false;return true;
}int main()
{memset(h, -1, sizeof(h));scanf("%d%d", &n, &m);int x, y, d;for (int i = 0; i < m; ++ i ){scanf("%d%d%d", &x, &y, &d);add(x, y, d), add(y, x, d);}int l = 0, r = 1e9;while (l < r){int mid = l + r >> 1;if (check(mid)) r = mid;else l = mid + 1;}printf("%d\n", l);return 0;
}

增广路径

从二分图的非匹配点开始,经过非匹配边,匹配边,非匹配边,匹配边…最后到非匹配点的路径被称为增广路径
image.png
将所有匹配边删除,添加非匹配边,图中匹配的对数+1
最大匹配不存在增广路径


372. 棋盘覆盖

372. 棋盘覆盖 - AcWing题库
image.png

建图方式很特殊,将每个格子看成点,相邻格子之间连一条边,问题就转换成了从图中选择最多的边,使得每条边的点都不重复
这就是一个最大匹配问题
接着判断图是否是一个二分图,若不是二分图,那么不能使用匈牙利算法
n*m矩阵的奇数格和偶数格(横纵坐标之和)染上不同的颜色,相同颜色的为一组,那么整个矩阵就能被分成两个集合,由于只有相邻格子之间存在边,所以集合中的不存在边,只有集合之间存在边
image.png

枚举所有奇数格(或者偶数格),试着将其匹配。注意:不需要枚举坏掉的格子,匹配时也不用匹配坏掉的格子

#include <iostream>
#include <cstring>
using namespace std;const int N = 110;
typedef pair<int, int> PII;
PII match[N][N];
bool g[N][N], st[N][N];
int dx[4] = { 0, 1, 0, -1 }, dy[4] = { 1, 0, -1, 0 };
int n, m;bool find(int x, int y)
{for (int i = 0; i < 4; ++ i ){int nx = x + dx[i], ny = y + dy[i];if (!g[nx][ny] && nx >= 1 && nx <= n && ny >= 1 && ny <= n){if (!st[nx][ny]){auto t = match[nx][ny];st[nx][ny] = true;if (t.first == 0 || find(t.first, t.second)){match[nx][ny] = { x, y };return true;}}}}return false;
}int main()
{scanf("%d%d", &n, &m);int x, y;while (m -- ){scanf("%d%d", &x, &y);g[x][y] = true;}int res = 0;for (int i = 1; i <= n; ++ i )for (int j = 1; j <= n; ++ j )if ((i + j) % 2 && !g[i][j]){memset(st, false, sizeof(st));if (find(i, j)) res ++ ;}printf("%d\n", res);return 0;
}

debug:find的判断条件if (!g[nx][ny] && nx >= 1 && nx <= n && ny >= 1 && ny <= n)!g[nx][ny]写成了!g[x][y]
每次find之前st数组没有重置


最小点覆盖

给定一个无向图,从中选出最少的点,使得每条边只有一个端点被选择
结论:最小点覆盖 = 最大匹配数


376. 机器任务

376. 机器任务 - AcWing题库
image.png

分析题意:有k个任务,每个任务可以在A机器或者B机器上完成,但是机器必须调整为相应的模式,任务的执行顺序任意,求任意顺序中的最少调整次数

建图:将完成每个任务需要调整的模式看成点,一个任务有两个点,在这两点之间连线。显然,得到的图是一个二分图,由于不同任务在相同机器上需要调整的模式可能相同,这些点可以看成一个点
题目要完成所有任务,即选择每条边的一个点,根据题意也就是求最小点覆盖
用匈牙利求二分图的最大匹配即可
由于每台机器的初始状态为0,所以需要调整状态为0的任务不用切换模式,直接就能完成,因此建图时不需要建立这些任务

#include <iostream>
#include <cstring>
using namespace std;const int N = 210, M = 1010;
int h[N], e[M], ne[M], idx;
int match[N]; bool st[N];
int n1, n2, m;void add(int x, int y)
{e[idx] = y, ne[idx] = h[x], h[x] = idx ++ ;
}bool find(int x)
{for (int i = h[x]; i != -1; i = ne[i]){int y = e[i];if (!st[y]){st[y] = true;if (match[y] == 0 || find(match[y])){match[y] = x;return true;}}}return false;
}int main()
{while (scanf("%d", &n1), n1){idx = 0;memset(h, -1, sizeof(h));memset(match, 0, sizeof(match));scanf("%d%d", &n2, &m);int t, x, y;while (m -- ){scanf("%d%d%d", &t, &x, &y);if (x == 0 || y == 0) continue;add(x, y);}int res = 0;for (int i = 1; i <= n1; ++ i){memset(st, false, sizeof(st));if (find(i)) res ++ ;}printf("%d\n", res);}return 0;
}

最大独立集

从一个无向图中选出最多的点,使得选出的点之间都没有边
等价于去掉最少的点,将所有边破坏
等价于最小点覆盖,等价于最大匹配
假设一共n个点,最大匹配数位m,最大独立集的数量为n - m
最大团
从一个无向图中选出最多的点,使得选出的点之间都有边


378. 骑士放置

378. 骑士放置 - AcWing题库
image.png

建图:矩阵中,能互相攻击到的格子之间建立一条边
那么问题就转换成了求图的最大独立集,即选择的格子之间都没有边,不能相互攻击
image.png

验证建的图是否为二分图,将奇数格和偶数格染不同的颜色,若当前坐标为 ( x , y ) (x, y) (x,y),那么该坐标之和为 x + y x + y x+y,要得到与之相连的坐标,就要将x±1,y±2,坐标之和要±一个奇数
假设坐标之和为奇数,加上奇数得到偶数,格子的颜色不同
假设坐标之和为偶数,加上奇数得到奇数,格子的颜色也不同
所以该图是一个二分图,可以使用匈牙利算法求最大匹配

#include <iostream>
#include <cstring>
using namespace std;typedef pair<int, int> PII;
const int N = 110;
bool g[N][N], st[N][N];
PII match[N][N];
int dx[8] = { 1, 1, 2, 2, -1, -1, -2, -2 }, dy[8] = { 2, -2, 1, -1, 2, -2, 1, -1 };
int n, m, t;bool find(int x, int y)
{for (int i = 0; i < 8; ++ i ){int nx = x + dx[i], ny = y + dy[i];if (!g[nx][ny] && nx >= 1 && nx <= n && ny >= 1 && ny <= m){if (!st[nx][ny]){st[nx][ny] = true;auto t = match[nx][ny];if (t.first == 0 || find(t.first, t.second)){match[nx][ny] = { x, y };return true;}}}}return false;
}int main()
{scanf("%d%d%d", &n, &m, &t);int x, y;for (int i = 0; i < t; ++ i ){scanf("%d%d", &x, &y);g[x][y] = true;}int res = 0;for (int i = 1; i <= n; ++ i )for (int j = 1; j <= m; ++ j )if (!g[i][j] && (i + j) % 2){memset(st, 0, sizeof(st));if (find(i, j)) res ++ ;}printf("%d\n", n * m - t- res);return 0;
}

debug:求最大匹配时,只需要遍历一个集合中的点,可以是奇数格也可以是偶数格,即添加条件(i + j) % 2


最小路径点覆盖

针对有向无环图,用最少的互不相交(点不重复)的路径较所有点覆盖
没听懂,先跳过

相关文章:

第三章 图论 No.11二分图,匈牙利算法与点覆盖

文章目录 二分染色&#xff1a;257. 关押罪犯增广路径372. 棋盘覆盖 最小点覆盖376. 机器任务 最大独立集378. 骑士放置 最小路径点覆盖 二分染色&#xff1a;257. 关押罪犯 257. 关押罪犯 - AcWing题库 最大最小问题&#xff0c;一眼二分 答案的范围在 [ 1 , 1 e 9 ] [1, 1…...

Die2Die(D2D)和chip2chip(C2C)之间的高速互联接口

随着chiplet的兴起&#xff0c;Die2Die的高速互联越来越重要&#xff0c;相比于传统的C2C(chip2chip)的互联&#xff0c;D2D的片间距离很近(10mm量级)&#xff0c;且这些小的chip(裸片)最终形成一个封装【多芯片模块&#xff08;MCM&#xff09;】。所以D2D的互联信道短&#x…...

JAVA设计模式汇总

文章目录 一、设计模式分为三大类二、设计模式的六大原则三、汇总 一、设计模式分为三大类 创建型模式共五种&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式共七种&#xff1a;适配器模式、装饰器模式、代理模式、外观模式、桥接模式…...

【实战讲解】数据血缘落地实施

‍在复杂的社会分工协作体系中&#xff0c;我们需要明确个人定位&#xff0c;才能更好的发挥价值&#xff0c;数据也是一样&#xff0c;于是&#xff0c;数据血缘应运而生。 今天这篇文章会全方位的讲解数据血缘&#xff0c;并且给出具体的落地实施方案。 一、数据血缘是什么…...

Java课题笔记~ ServletContext

单个Servlet的配置对象 web.xml <servlet><servlet-name>FirstServlet</servlet-name><servlet-class>com.ambow.test.FirstServlet</servlet-class><init-param><param-name>charset</param-name><param-value>utf-8&…...

设备取电芯片LDR6328Q

2021年5月&#xff0c;USB-IF 协会发布了全新的USB PD3.1规范&#xff0c;该规范将快充功率上限从100 W提升至240W&#xff08;支持Extended Power Range&#xff0c;简称EPR&#xff09;。充电功率的提升也让USB PD的应用从手机、笔记本电脑&#xff0c;扩展到便携式设备、物联…...

Redis 事务、持久化、复制原理分析

Redis 事务、持久化、复制原理分析 一、Redis 简介1.1 Redis1.2 Redis 事务 二、Redis 事务机制2.1 事务基本概念2.2 Redis 事务操作2.2.1 开启事务2.2.2 批量执行命令2.2.3 事务提交与回滚 三、Redis 持久化机制3.1 持久化机制基本概念3.2 Redis 持久化方案3.2.1 RDB 持久化3.…...

初识鸿蒙跨平台开发框架ArkUI-X

HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上&#xff0c;HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备&#xff0c;提供全场景&#…...

uniapp开发小程序-分包(微信错误码:800051)

在使用uniapp开发小程序时&#xff0c;上传的时候因为文件过大&#xff0c;显示上传失败。 以下是开发过程中遇到的问题及解决方法&#xff1a; 1. 问题一&#xff1a;因为文件过大&#xff0c;显示上传失败 ①尝试过把本地使用的图片压缩到最小&#xff1b; ②把图片转换为网…...

n-皇后问题

希望这篇题解对你有用&#xff0c;麻烦动动手指点个赞或关注&#xff0c;感谢您的关注 不清楚蓝桥杯考什么的点点下方&#x1f447; 考点秘籍 想背纯享模版的伙伴们点点下方&#x1f447; 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不能错过的模板大全…...

JS如何向数组中添加数组

常见的办法有 1、push()方法 var arr [a, b, c,d]; arr.push(e); console.log(arr); // [a, b, c, d,e] 2、concat()方法 var arr1 [a, b, c]; var arr2 [d, e, f]; var arr3 arr1.concat(arr2); console.log(arr3); // [a, b, c, d, e, f] 3、可以使用ES6中的spread操作符…...

串口通信收发项目级一

void 定时器中断函数入口(void) { if(判断是否为定时器中断) { static uint16_t num定义静态变量; static uint8_t index定义静态变量; unsigned char buff_busy定义局部变量; if(串口中断接收数据数量>静态变量) { 静态变量串口中断接收数据数量; } else if(静态变量串口中…...

设计模式之七:适配器模式与外观模式

面向对象适配器将一个接口转换成另一个接口&#xff0c;以符合客户的期望。 // 用火鸡来冒充一下鸭子class Duck { public:virtual void quack() 0;virtual void fly() 0; };class Turkey { public:virtual void gobble() 0;virtual void fly() 0; };class TurkeyAdapter :…...

FFmpeg接收UDP码流

一、FFmpeg参数初始化&#xff1a; //在打开码流前指定各种参数比如:探测时间/超时时间/最大延时等//设置缓存大小,1080p可将值调大av_dict_set(&options, "buffer_size", "8192000", 0);//以tcp方式打开,如果以udp方式打开将tcp替换为udpav_dict_set(…...

【Pytroch】基于支持向量机算法的数据分类预测(Excel可直接替换数据)

【Pytroch】基于支持向量机算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.数学公式3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种强大的监…...

【Git】git初始化项目时 | git默认创建main分之 | 如何将git默认分支从main改为master

git 更改 branch 在 Git 中&#xff0c;如果你在第一次提交后想要将默认分支名从 main 修改为 master&#xff0c;你可以按照以下步骤进行操作&#xff1a; 创建 master 分支&#xff1a; 首先&#xff0c;你需要在当前的 main 分支基础上创建一个新的 master 分支。使用以下命…...

Vue3中配置environment

environment顾名思义就是环境&#xff0c;对于项目来说&#xff0c;无非就是&#xff1a; 开发环境&#xff1a;development生产环境&#xff1a;production 某些逻辑&#xff0c;配置等在两个不同的环境中要呈现出不同的状态&#xff0c;所以environment是一个必要的事情。 …...

前端基础积累_新技术_Vue_React_H5_奇怪的BUG_面试_招聘

前端之路 序 前几天在博客园收到了一封来自出版社的消息&#xff0c;说看到原来很久之前写的 < VueJS 源码分析的文章 > 希望能够联系他们出版社去写书。这样的事情虽然在博客园是会经常发生的&#xff0c;但是这也让我意识到了&#xff0c;多多写高质量的文章能够给 co…...

【密码学】维京密码

维京密码 瑞典罗特布鲁纳巨石上的图案看起来毫无意义&#xff0c;但是它确实是一种维京密码。如果我们注意到每组图案中长笔画和短笔画的数量&#xff0c;将得到一组数字2、4、2、3、3、5、2、3、3、6、3、5。组合配对得到24、23、35、23、36、35。现在考虑如图1.4所示的内容&a…...

小米基于 Flink 的实时计算资源治理实践

摘要&#xff1a;本文整理自小米高级软件工程师张蛟&#xff0c;在 Flink Forward Asia 2022 生产实践专场的分享。本篇内容主要分为四个部分&#xff1a; 发展现状与规模框架层治理实践平台层治理实践未来规划与展望 点击查看原文视频 & 演讲PPT 一、发展现状与规模 如上图…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...