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

news2024/11/26 0:21:51

题目

给定一个二分图,其中左半部包含nq个点(编号1n1),右半部包含ng个点(编号1n2),二分图共包含m条边。
数据保证任意—条边的两个端点都不可能在同一部分中。请你求出二分图的最大匹配数。
给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配。
所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。

输入格式

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

输出格式

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

数据范围

1≤n1, n2≤500,1 ≤u≤n1,
1<o≤n2,1 ≤m ≤105

  • 输入样例:
2 2 4 
1 1
1 2
2 1
2 2
  • 输出样例:
2

题解

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author akuya
 * @create 2023-07-11-21:25
 */
public class Hungary {
    static int N=510;
    static int M=100010;
    static int n1,n2,m;
    static int h[] =new int[N];
    static int e[]=new int[M];
    static int ne[]=new int[M];
    static int idx;
    static int match[]=new int[N];
    static boolean st[]=new boolean[N];
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        n1=scanner.nextInt();
        n2=scanner.nextInt();
        m=scanner.nextInt();
        Arrays.fill(h,-1);
        while(m--!=0){
            int a,b;
            a=scanner.nextInt();
            b=scanner.nextByte();
            add(a,b);
        }

        int res=0;

        for(int i=1;i<=n1;i++){
            //为什么需要每次都清空
            //因为n1集合每个点都需要匹配n2集合的每一个点,但是不能重复
            Arrays.fill(st,false);
            if(find(i))res++;
        }

        System.out.println(res);

    }
    public static void add(int a ,int b){
        e[idx]=b;ne[idx]=h[a];h[a]=idx++;
    }

    public static boolean 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])){
                    match[j]=x;
                    return true;
                }
            }
        }

        return false;

    }


}

思路

匈牙利算法,原理复杂,在这里不讲解,用于求二分图的最大连接数,最大连接数题干中有讲解。
简单叙述实现方法为,遍历左部集合的每一个点,去与有关系的右部集合匹配,若能匹配成功,则最大连接数加一,若不能匹配成功(该右部点已经被匹配过),会去查看被占用的该右部的左部点能否和其他右部点相连,能则转移,使两个左部点都能有右部相连。在这种情况下完成求得最大连接数。
在这里插入图片描述
以男女生作比,男为左部,女为右部,男1喜欢女1和女2,遍历到男1时,直接将男1与女1匹配,并记录,遍历到男2时,若男2只喜欢女1,刚好,男1也喜欢女2,这时将会将男1与女2匹配,将男2与女1匹配,达到最大匹配数(此处仅仅为作比,没有其他含义)

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

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

相关文章

软件测试基础认知

日升时奋斗&#xff0c;日落时自省 目录 1、测试需求 2、测试用例 3、软件测试BUG 4、开发模型 4.1、软件的生命周期 4.2、瀑布模型&#xff08;waterFall Model&#xff09; 4.3、螺旋模型 4.4、 增量模型 4.4.1、增量开发 4.4.2、迭代开发 4.5、敏捷开发&#xf…

【PDFBox】PDFBox操作PDF文档之创建PDF文档、加载PDF文档、添加空白页面、删除页面、获取总页数、添加文本内容、PDFBox坐标系

这篇文章&#xff0c;主要介绍PDFBox操作PDF文档之创建PDF文档、加载PDF文档、添加空白页面、删除页面、获取总页数、添加文本内容、PDFBox坐标系。 目录 一、PDFBox组件 1.1、什么是PDFBox 1.2、创建PDF文档 1.3、加载PDF文档 1.4、添加空白页面 1.5、删除某个页面 1.6…

三分钟了解 SpringBoot 的启动流程

一、前言 背景&#xff1a;最近有位开发同学说面试被问到Spring Boot 的启动流程&#xff0c;以及被问到Spring Boot 的嵌入式Web容器是什么时候加载的。如何加载的。是怎么无缝切换的。 这些问题&#xff0c;其实回答起来也是比较复杂的。我们今天就从 SpringApplication.ru…

3D设计建模软件The Foundry Modo 16对Mac和Windows的系统要求

Foundry MODO是一款功能强大的三维建模、动画和渲染软件。它为艺术家和设计师提供了一套全面的工具&#xff0c;可以用来创建令人惊叹的视觉效果。无论是制作电影、电视节目、游戏还是其他数字媒体内容&#xff0c;MODO都可以满足您的需求。 MODO具有直观的用户界面&#xff0…

redis主从配置

从redis配置&#xff1a;redis6386.conf include /data/redis/redis6380.conf #主redis配置文件路径&#xff08;这里是引用主配置文件里的配置在修改从配置&#xff09; daemonize yes #在后台启动 protected-mode no #加密保护关闭 bind 192.168.3.*** requirepas…

云主机安全-私有密钥安全认证

场景描述 云主机凭借其性价比高、生配扩容便利、运维便捷、稳定性高等优势深受用户青睐&#xff0c;越来越多的企业开始租用云主机&#xff0c;将自己的服务器、业务系统等搭建或存储到云主机上。 用户痛点 用户租用或托管的云主机&#xff0c;运维端口&#xff08;远程桌面&…

SSM框架最新整合保姆级教程(IDEA版)

SSM框架最新整合保姆级教程(IDEA版) 一、环境要求 ​ 环境&#xff1a; IDEAMySQL 5.7.19Tomcat 9Maven 3.6 要求&#xff1a; 需要熟练掌握MySQL数据库&#xff0c;Spring&#xff0c;JavaWeb及MyBatis知识&#xff0c;简单的前端知识&#xff1b; 完整代码&#xff1a;…

Openlayers实战:绘制带箭头的线

Openlayers地图中有的时候会用到这样的场景,连续画几段线段,但是要知道绘制的方向,给人以指引的提示作用。 怎么绘制呢? 在本实战中,主要的是处理线段的显示方式,在线段的拐点处附加上箭头图片,具体看实际的源代码。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhu…

4 生成全排列

4 生成全排列 作者: 赵晓鹏时间限制: 1S章节: 递归与分治 输入范例 : 无 输出范例 : Perm1(1):123 Perm1(2):123 Perm1(2):213 Perm1(2):321 Perm1(3):123 Perm1(3):132 Perm1(3):213 Perm1(3):231 Perm1(3):321 Perm1(3):312 Online Judge 1.0 #include<iostream> …

【全栈开发指南】数据权限使用配置

数据权限配置有两种方式&#xff1a; 通过系统配置界面&#xff0c;实时配置生效。 通过代码注解配置。 一、通过系统配置界面配置数据权限 系统配置的数据权限是通过系统配置界面将配置信息保存在数据库&#xff0c;然后系统启动时&#xff0c;将配置信息保存到Redis缓存来…

SpringCloud分布式搜索引擎、数据聚合、ES和MQ的结合使用、ES集群的问题

目录 数据聚合 聚合的分类 ​编辑 DSL实现Bucket聚合 ​编辑 DSL实现Metrics聚合​编辑 RestAPI实现聚合 对接前端接口​编辑 自定义分词器​编辑 Completion suggester查询 Completion suggester查询 酒店数据自动补全 实现酒店搜索框界面输入框的自动补全 数据同步问…

Codeforces Round 875 (Div. 1) A. Copil Copac Draws Trees

题意 Copil Copac 给定了一个由 n−1 条边组成的列表&#xff0c;该列表描述了一棵由 n 个顶点组成的树。他决定用下面的算法来绘制它&#xff1a; 步骤 0&#xff1a;绘制第一个顶点&#xff08;顶点1&#xff09;。转到步骤1。 步骤 1&#xff1a;对于输入中的每一条边&#…

Window10 系统 RabbitMQ的安装和简单使用

1、下载 & 安装 Erlang 因为RabbitMQ的服务端是基于 Erlang编写的&#xff0c;所以&#xff0c;首先需要安装Erlang。 1&#xff09;下载 下载地址如下&#xff1a; https://www.erlang.org/downloads此处下载比较慢&#xff0c;可以参考如下百度网盘&#xff1a; 链接…

常用的缓存工具有ehcache、memcache和redis,这里介绍spring中ehcache的配置。

常用的缓存工具有ehcache、memcache和redis&#xff0c;这里介绍spring中ehcache的配置。 1.在pom添加依赖&#xff1a; <!-- ehcache 相关依赖 --><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><ve…

正则表达式测试(二)

一、中括号的语法 匹配所有的字符&#xff0c;返回一个数组,包含匹配的所有字符内容&#xff0c;按顺序展开&#xff1b; 注意&#xff1a;空格也会被匹配到 匹配所有符合的字符&#xff0c;返回一个数组。 匹配空白字符 匹配非空白字符 匹配 空白字符 非空白字符 如上所示&am…

二叉树的简单遍历

假设节点数据类如下&#xff1a; public class TreeNode {String val;TreeNode left;TreeNode right;TreeNode() { }TreeNode(String val) {this.val val;}TreeNode(String val, TreeNode left, TreeNode right) {this.val val;this.left left;this.right right;} } 二叉…

Vue3+TS+Vite创建项目,并导入Element-plus和Sass

一、vue3创建项目 1.桌面新建一个文件夹Vue3-app 打开编辑器导入文件夹&#xff0c;编辑器打开终端输入或者命令行工具cd到项目目录下输入 npm init vuelatest 回车运行 这里我选择了TSVite来开发&#xff0c;并选择安装路由 2.cd到 vue-project目录下 输入 npm install 回车…

路径规划算法:基于晶体结构优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于晶体结构优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于晶体结构优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

基于高斯混合模型聚类的风电场短期功率预测方法(Pythonmatlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MySQL 学习笔记 1:存储过程

MySQL 学习笔记 1&#xff1a;存储过程 图源&#xff1a;ubiq.co 存储过程可以看做是将一组 SQL打包执行&#xff0c;并返回最终的执行结果。 其优点是&#xff1a;因为存储过程中的 SQL 是同时一次执行&#xff0c;所以没有数据一致性的问题。其次&#xff0c;不需要由客户端…