二分图的最大匹配,也可以称为匈牙利算法,或者找女友算法
算法描述:

  1. 我们认为所有妹子都是可以去尝试的
  2. 如果发现妹子已经有了男朋友,那么我们出于不达目的不罢休的态度,我们去找她男朋友,问他能不能换一个女朋友
  3. 如果他有备胎,换了女朋友,那么我们就把妹子拿下
  4. 如果他也没办法,换不了,那么我们也就没办法了,尽力了

题目描述:
给定一个二分图,其中左半部包含 n1 个点(编号 1∼n1),右半部包含 n2 个点(编号 1∼n2),二分图共包含 m 条边。
数据保证任意一条边的两个端点都不可能在同一部分中。
请你求出二分图的最大匹配数。

二分图的匹配:给定一个二分图 G,在 G 的一个子图 M 中,M 的边集 {E} 中的任意两条边都不依附于同一个顶点,则称 M 是一个匹配。二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。

输入格式
第一行包含三个整数 n1、 n2 和 m。

接下来 m 行,每行包含两个整数 u 和 v,表示左半部点集中的点 u 和右半部点集中的点 v 之间存在一条边。

输出格式
输出一个整数,表示二分图的最大匹配数。

数据范围

1≤n1,n2≤500,
1≤u≤n1,
1≤v≤n2,
1≤m≤105

输入样例:

2 2 4
1 1
1 2
2 1
2 2

输出样例:

2

代码实现:

import java.io.*;
import java.util.*;public class Main{public static int[] e = new int[100010];public static int[] ne = new int[100010];public static int[] h = new int[510];public static int[] match = new int[510];public static boolean[] st = new boolean[510];public static int idx = 0;public static void main(String[] args)throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] lens = br.readLine().split(" ");int n1 = Integer.parseInt(lens[0]);int n2 = Integer.parseInt(lens[1]);int m = Integer.parseInt(lens[2]);Arrays.fill(h, -1);while (m-- > 0){String[] res = br.readLine().split(" ");int a = Integer.parseInt(res[0]);int b = Integer.parseInt(res[1]);add(a, b);}int res = 0;for (int i = 1; i <= n1; i++){Arrays.fill(st, false); //对每个男生来说,一开始所有的妹子都是没有尝试的,所以我们一定要去尝试!if (find(i)) res++;}System.out.print(res);}public static boolean find(int t){for (int i = h[t]; i != -1; i = ne[i]){int j = e[i];if (!st[j]){st[j] =  true; // 代表已经尝试过了,不后悔了if (match[j] == 0 || find(match[j])){ // match指妹子的男朋友,0表示没有男朋友match[j] = t;return true;}}}return false;}public static void add(int a, int b){e[idx] = b;ne[idx] = h[a];h[a] = idx++;}
}

学习了代码,也了解了人生智慧,共勉!

二分图的最大匹配(找女友算法)相关推荐

  1. 二分图的最大匹配(匈牙利算法)HDU1083

    二分图: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同 ...

  2. 二分图的最大匹配:匈牙利算法,先到先得,能让则让,男生找妹子

    原题链接:https://www.acwing.com/problem/content/description/863/ 左边站了一排男的,右边占了一排女的. 左边的某些男的,对右边的某些女的有好感. ...

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

    题目连接 https://www.acwing.com/problem/content/863/ 思路 我们选择左半边或者右半边作为枚举点,然后对于当前的位置做一次判断如果当前位置的第一条边的女生已经 ...

  4. 第5-1课:匈牙利算法与二分图的最大匹配

    在图论中,二分图(又称二部图)是一个特殊的模型,关于二分图有很多概念,比如匹配.完全匹配.最大匹配等.这一课我们来介绍一种求二分图的最大匹配的匈牙利算法,匈牙利算法原理是公开的,人们使用匈牙利算法都是 ...

  5. 二分图的最大匹配—匈牙利算法

    [基本概念]: 二分图: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分 ...

  6. 用匈牙利算法求二分图的最大匹配

    转载大神的!! 什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到.二分图的最大匹配有两种求法,第一种是最大流(我在此假设读者已有网络流的知识):第二种就是我现在要讲的匈牙利算 ...

  7. hihocoder 1122 : 二分图二•二分图最大匹配之匈牙利算法

    首先,匈牙利算法是用来求二分图的最大匹配的,它的核心问题就是找增广路径.匈牙利算法的时间复杂度为O(VE),其中 V为二分图左边的顶点数,E为二分图中边的数目. 现在我们来看看增广路有哪些性质: (1 ...

  8. 二分图的最大匹配 匈牙利算法

    基本概念 1.二分图: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别 ...

  9. python最长匹配_二分图最大匹配:匈牙利算法的python实现

    二分图匹配是很常见的算法问题,一般用匈牙利算法解决二分图最大匹配问题,但是目前网上绝大多数都是C/C++实现版本,没有python版本,于是就用python实现了一下深度优先的匈牙利算法,本文使用的是 ...

最新文章

  1. uniapp添加顶部导航栏颜色渐变
  2. Core篇——初探Core的认证,授权机制
  3. JavaFX 之窗口大小自由拉伸(四)
  4. 『WPF』实现拖动文件到窗体(控件)
  5. SQL Server 2012 创建数据库快照
  6. 远程调用——hessian使用入门
  7. 兴趣爱好-常用的10种算法
  8. 2021-05-15 SqlServer面试题 通用篇
  9. 闪耀超颖光栅的建模与设计
  10. CocosCreator之绳索摆动效果
  11. 在themeforest购买主题获得激活码方法
  12. 【C基础练习题】Week9:凯撒密码 | 按空格切分字符串 | 单词折半拆分
  13. oracle 列转行字符串,oracle 字符串列转行
  14. 微信支付-当前页面的URL未注册
  15. vb.net 教程 5-9 屏幕范围内取色
  16. Linux下的makefile编写 ——陈皓《跟我一起写Makefile》学习笔记(一)
  17. java屏蔽虚拟按键代码_Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP)/动态显示和隐藏NavigationBar...
  18. win7-64bit 安装Python3.5
  19. CA6140后托架(831001)加工工艺及夹具设计CAD图纸(论文 CAD图纸 开题报告 任务书 工艺卡 文献翻译)
  20. u-boot for tiny210 ver2.2.1(by liukun321咕唧咕唧)

热门文章

  1. 微信的7.0版新版与中年危机
  2. 夜深人静写算法(七)- 字典树
  3. 影视解说怎么做?超详细教程分享给大家
  4. [VPN]华为SecoClient客户端Linux使用
  5. Spring是什么?
  6. 宁波到西塘可以坐火车去吗?
  7. 【进度2】从阿里云迁至腾讯云,并添加网站备案号
  8. 理赔系统复杂性概述以及工作台的必要性阐述
  9. python svg 转 png
  10. 化妆品管理软件的人员调研多家连锁店后提醒您,细节管理很重要