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

搜索与图论:匈牙利算法

将所有点分成两个集合,使得所有边只出现在集合之间,就是二分图

二分图:一定不含有奇数个点数的环;可能包含长度为偶数的环, 不一定是连通图

二分图的最大匹配:

#include<iostream>
#include<cstring>
using namespace std;
const int N = 510 , M = 100010;
int n1,n2,m;
int h[N],ne[M],e[M],idx;//邻接表
bool st[N];
int match[N];void add(int a , int b)
{//头插法//如图 如1与2之间要有一条线,让2的ne为1,再让h[1]为2的索引。//这样h[1]就是1节点存的最后一个相连的点,如图就是7节点。//而在索引表内部,通过头插法的方式(即每次ne指向上一个点(h存的就是上一个点)),索引表为:7->4->2e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}int find(int x)
{//遍历自己喜欢的女孩for(int i = h[x] ; i != -1 ;i = ne[i]){int j = e[i];if(!st[j])//如果在这一轮模拟匹配中,这个女孩尚未被预定{st[j] = true;//那x就预定这个女孩了,这里预定是防止她男朋友找其他喜欢的女孩时不重复找这个//如果女孩j没有男朋友,或者她原来的男朋友能够预定其它喜欢的女孩。配对成功if(!match[j]||find(match[j])){match[j] = x;return true;}}}//自己中意的全部都被预定了。配对失败。return false;
}int main()
{memset(h,-1,sizeof h);scanf("%d%d%d",&n1,&n2,&m);while(m--){int a,b;scanf("%d%d",&a,&b);add(a,b);}int res = 0;for(int i = 1; i <= n1 ;i ++){  //因为每次模拟匹配的预定情况都是不一样的所以每轮模拟都要初始化memset(st,false,sizeof st);if(find(i)) res++;//找到一条边,则res++}  printf("%d\n",res);
}

http://www.lryc.cn/news/210401.html

相关文章:

  • 明星艺人类的百度百科怎么创建 ?
  • 类EMD的“信号分解方法”及MATLAB实现(第八篇)——离散小波变换DWT(小波分解)
  • python随手小练10(南农作业题)
  • How to install mongodb-7.0 as systemd service with podman
  • 一文彻底理解python浅拷贝和深拷贝
  • 什么是软件的生命周期?全方位解释软件的生命周期
  • 网络安全—小白自学
  • List 3.5 详解原码、反码、补码
  • 数据清洗与规范化详解
  • Ansible playbook的block
  • Jupyter Notebook还有魔术命令?太好使了
  • DailyRecord-231029
  • 雨云虚拟主机使用教程WordPress博客网站搭建教程
  • 【SPSS】基于RFM+Kmeans聚类的客户分群分析(文末送书)
  • 回溯法(1)--装载问题和0-1背包
  • [javaweb]——HTTP请求与响应协议,常见响应状态码(如:404)
  • Java面向对象(进阶)-- 拼电商客户管理系统(康师傅)
  • Qt配置OpenCV教程,亲测已试过
  • 【实用网站分享】
  • 问题 U: 折线分割平面(类比+规律)
  • npm 彻底卸载
  • 云安全-云原生技术架构(Docker逃逸技术-特权与危险挂载)
  • 【Python爬虫三天从0到1】Day1:爬虫核心
  • 2023-10 最新jsonwebtoken-jjwt 0.12.3 基本使用
  • 云起无垠典型案例入选《2023软件供应链安全洞察》报告
  • 怎么从休学证明中取出休学原因(python自动化办公,涉及word和excel)
  • C语言 定义一个函数,并调用,该函数中打印显示直角三角形
  • Doceker-compose——容器群集编排管理工具
  • Redis 与 MySQL 一致性 实现方案
  • 运维 | 使用 Docker 安装 Jenkins | Jenkins