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

【AcWing】861. 二分图的最大匹配(匈牙利算法)

匈牙利算法,他可以在比较快的时间复杂度之内告诉我们左边和右边成功匹配的最大数是多少

匹配指的是边的数量,成功的匹配指的是两个未被使用的点之间存在一条边(就不存在两条边共用了一个点的)。

匈牙利算法可以返回成功匹配的最大匹配数是多少。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;const int N=510,M=1e5+10;
int h[N],e[M],ne[M],idx;
int match[N];//match表示的是这个妹子匹配的男生是谁,0代表没有匹配。
bool st[N];//表示这个女生是否考虑过
int n1,n2,m;void add(int a,int b){e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}bool find(int x){for(int i=h[x];i!=-1;i=ne[i]){//枚举看上妹子的集合int j=e[i];if(!st[j]){//如果这个妹子没有考虑过st[j]=true;//表示这个妹子已经被考虑了if(match[j] == 0 || find(match[j])){//妹子没有匹配的男生 或 这个男生可以找到其他的妹子代替//如果这个被替换妹子的男生的其他相连的女生被匹配了的话,会让匹配的那个男生再去找其他妹子,就是套娃,牵一发动所有有关系的人。每个男生进入find都会对已经被考虑的妹子变为true,不会造成重复考虑。match[j]=x;return true;   }}}return false;
}int main(){cin>>n1>>n2>>m;memset(h,-1,sizeof h);while(m--){int a,b;cin>>a>>b;add(a,b);//虽然是无向边,但只会找一下左边点的所有出边,只需要存左边指向右边就可以了。}int res=0;//匹配数量//就依次来分析一下每个男生,该找哪个妹子。for(int i=1;i<=n1;i++){memset(st,false,sizeof st);//每一次分析之前,清空所有妹子,表示这些妹子都还没考虑过,保证每个妹子我只考虑一遍。if(find(i)) res++;//判断是否能找到妹子}cout<<res<<endl;return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python-网页自动化(二)
  • 强烈推荐!分享5款ai论文生成软件
  • 修改密码模块中对轮询接口响应用户失效问题的处理
  • Android13 Hotseat客制化--Hotseat修改布局、支持滑动、去掉开机弹动效果、禁止创建文件夹
  • GitHub图床
  • pytorch pyro 贝叶斯神经网络 bnn beyesean neure network svi ​定制SVI目标和培训循环,变更推理
  • 经验笔记:前端堆栈分配
  • 批量下载,控制并发(利用promise 做需求池队列)
  • 如何理解基于架构的软件设计(ABSD)
  • TMS320F28335芯片及使用介绍
  • 不到200行代码,一键写出简单贪吃蛇网页游戏!附详细代码!快来看看吧!
  • QML学习二:Qt启用qml文件实时预览编辑,以及打印日志到控制台
  • 【开源大模型生态5】解放大脑
  • 1034. 边界着色(JAVA)
  • SpringCloud之CircuitBreaker
  • 《Java编程思想》读书笔记-对象导论
  • chrome扩展demo1-小时钟
  • gf框架之分页模块(五) - 自定义分页
  • Golang-长连接-状态推送
  • GraphQL学习过程应该是这样的
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Rancher-k8s加速安装文档
  • Sequelize 中文文档 v4 - Getting started - 入门
  • session共享问题解决方案
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • vue-loader 源码解析系列之 selector
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 从0到1:PostCSS 插件开发最佳实践
  • 分享几个不错的工具
  • 构建工具 - 收藏集 - 掘金
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 盘点那些不知名却常用的 Git 操作
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • # 透过事物看本质的能力怎么培养?
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #100天计划# 2013年9月29日
  • #etcd#安装时出错
  • #pragma once
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十八)三元表达式和列表解析
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四)opengl函数加载和错误处理
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)memcache、redis缓存
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • ../depcomp: line 571: exec: g++: not found
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全