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

给定一个二分图,其中左半部包含n1n1个点(编号1~n1n1),右半部包含n2n2个点(编号1~n2n2),二分图共包含m条边。

数据保证任意一条边的两个端点都不可能在同一部分中。

请你求出二分图的最大匹配数。

二分图的匹配:给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配。

二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。

输入格式

第一行包含三个整数 n1n1、 n2n2 和 mm。

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

输出格式

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

数据范围

1≤n1,n2≤5001≤n1,n2≤500,
1≤u≤n11≤u≤n1,
1≤v≤n21≤v≤n2,
1≤m≤1051≤m≤105

输入样例:

2 2 4
1 1
1 2
2 1
2 2

输出样例:

2

时间复杂度O(mn)  实际运行时间一般远小于O(mn)

代码:
//匈牙利算法
//思路:一个二分图,从左边子图最多能找到右边子图一一匹配的最大数量
//对于左边子图的某点,找右边子图的某点;如果右边连通的某点没有被匹配,那么可以选择该点作为匹配点;
//否则,右边该点已经被匹配,则看看与右边的这个点匹配的左边的点能否还能找到另一个匹配的右边的点,
//如果能,则把右边这个点让给当前待匹配的左边的点

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

public class Main{
        static final int N=505,M=100005;
        static int h[]=new int[N];
        static int e[]=new int[M];
        static int ne[]=new int[M];
        static int n1,n2,m,idx;
        static int match[]=new int[N];
        static boolean vis[]=new boolean[N];
        static void add(int a,int b){
                e[idx]=b;
                ne[idx]=h[a];
                h[a]=idx++;
        }
        static boolean find(int u){
                for(int i=h[u];i!=-1;i=ne[i]){
                        int j=e[i];
                        if(!vis[j]){
                                vis[j]=true;
                                if(match[j]==0 || find(match[j])){//右边的该点没有被匹配或者j对应的左边的点能找到另一个能匹配的右边的点
                                        match[j]=u;
                                        return true;
                                }
                        }
                }
                return false;
        }
        public static void main(String[] args) {
                Scanner scan=new Scanner(System.in);
                Arrays.fill(h, -1);
                n1=scan.nextInt();
                n2=scan.nextInt();
                m=scan.nextInt();
                while(m-->0){
                        int a=scan.nextInt();
                        int b=scan.nextInt();
                        add(a,b);//我们只从左边向右边查找
                }
                int res=0;
                for(int i=1;i<=n1;i++){
                        Arrays.fill(vis, false);//初始化,对于每一个左边的点,一开始它都没有匹配右边的点
                        if(find(i)) res++;
                }
                System.out.println(res);
        }
}

原文地址:https://www.cnblogs.com/qdu-lkc/p/12255573.html

时间: 2024-07-29 09:26:00

861. 二分图的最大匹配(匈牙利算法模板)的相关文章

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

一.前人种树 博客:趣写算法系列--匈牙利算法 博客:二分图最大匹配 博客:二分图的最大匹配--匈牙利算法 二.题目讲解 博客:POJ1274:The Perfect Stall(二分图最大匹配 匈牙利算法)

二分图匹配(匈牙利算法模板)

二分最大匹配的匈牙利算法模板 /* *************************************************** 二分图匹配(匈牙利算法的DFS实现) INIT:G[][]两边定点划分的情况 CALL:res=Hungary();输出最大匹配数 优点:适于稠密图,DFS找增广路快,实现简洁易于理解 时间复杂度:O(VE); *************************************************** */ const int MAXN = 51

hdu 2063 过山车 (最大匹配 匈牙利算法模板)

匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2063 题目大意: 中文题目,点进去马上知道. 解题思路: 这道题目就是求最大匹配数目,直接套用匈牙利算法模板,这个算法大概原则就是:有机会上,没有机会创造机会也要上. 代码: 1 #i

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

算法复杂度(v*e) /* ************************************************************************** //二分图匹配(匈牙利算法的DFS实现) //初始化:g[][]两边顶点的划分情况 //建立g[i][j]表示i->j的有向边就可以了,是左边向右边的匹配 //g没有边相连则初始化为0 //uN是匹配左边的顶点数,vN是匹配右边的顶点数 //调用:res=hungary();输出最大匹配数 //优点:适用于稠密图,DFS

二分图的最大匹配 (匈牙利算法)再续

标签:二分图 最大匹配 最小集覆盖 匈牙利算法 1.二分图.最大匹配 什么是二分图:二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图. 什么是匹配:把上图想象成3男4女搞对象(无同性恋),连线代表彼此有好感,但最终只能1夫1妻,最终的配对结果连线就是一个匹配.匹配可以是空. 什么是最大匹配:在有好

POJ #3041 Asteroids 3041 二分图最小覆盖 最大匹配 匈牙利算法

Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K asteroids (1 <= K <= 10,000), which are conveniently located at the lattice points of the

【二分图匹配入门专题1】F - COURSES poj1469【最大匹配--匈牙利算法模板题】

Consider a group of N students and P courses. Each student visits zero, one or more than one courses. Your task is to determine whether it is possible to form a committee of exactly P students that satisfies simultaneously the conditions: every stude

hdu 2063 过山车 二分图的最大匹配 匈牙利算法

题目地址:http://acm.hdu.edu.cn/showproblem.php? pid=2063 #include <iostream> #include <stdio.h> #include <string.h> using namespace std; int n,m,k; int link[505][505]; int used[505]; int boy[505]; int find(int x){ int i; for(i=1;i<=n;i++)

Ural1109_Conference(二分图最大匹配/匈牙利算法/网络最大流)

解题报告 二分图第一题. 题目描述: 为了参加即将召开的会议,A国派出M位代表,B国派出N位代表,(N,M<=1000) 会议召开前,选出K队代表,每对代表必须一个是A国的,一个是B国的; 要求每一个代表要与另一方的一个代表联系,除了可以直接联系,也可以电话联系,求电话联系最少 思路: 电话联系最少就要使直接联系最大,又是一一匹配关系,就是二分图的最大匹配. 下面是匈牙利算法. #include <cstdio> #include <cstring> #include <

UESTC 919 SOUND OF DESTINY --二分图最大匹配+匈牙利算法

二分图最大匹配的匈牙利算法模板题. 由题目易知,需求二分图的最大匹配数,采取匈牙利算法,并采用邻接表来存储边,用邻接矩阵会超时,因为邻接表复杂度O(nm),而邻接矩阵最坏情况下复杂度可达O(n^3). 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> u