目录

1 问题描述

2 解决方案

 


1 问题描述

何为二分图的最大匹配问题?

引用自百度百科:

首先得说明一下何为匹配:

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

极大匹配(Maximal Matching)是指在当前已完成的匹配下,无法再通过增加未完成匹配的边的方式来增加匹配的边数。最大匹配(maximum matching)是所有极大匹配当中边数最大的一个匹配。选择这样的边数最大的子集称为图的最大匹配问题。

特别注意:二分图的最大匹配,其图为无权连通图。二分图的最大权分配,其图才是有权连通图,这两者是不同的概念。


2 解决方案

此处采用DFS方法。

具体代码如下:

package com.liuzhen.practice;

import java.util.Scanner;

public class Main {

    public static int n = 0, m = 0;  //二分图的左边和右边顶点数目
/*
* 参数map:给定的二分图,map[i][j]等于1表示i到j连通,为0则表示不连通
* 参数linked:linked[i] = u表示顶点i与顶点u连接
* 参数start:当前start顶点出发,寻找增广路径
* 函数功能:如果能够找到已顶点start开始的增广路径返回true,否则返回false
*/
public boolean dfs(int[][] map, boolean[] used, int[] linked, int start) {
for(int i = 0;i < m;i++) {
if(used[i] == false && map[start][i] == 1) {
used[i] = true;
if(linked[i] == -1 || dfs(map, used, linked, linked[i])) {
linked[i] = start;
return true;
}
}
}
return false;
} public int getMaxNum(int[][] map) {
int count = 0;
int[] linked = new int[m];
for(int i = 0;i < m;i++)
linked[i] = -1;
for(int i = 0;i < n;i++) {
boolean[] used = new boolean[m]; //初始化m部分顶点均为被访问
if(dfs(map, used, linked, i)) //从顶点i出发能够得到一条增广路径
count++;
}
return count;
} public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
int[][] map = new int[n][m];
int k = in.nextInt(); //二分图中边的数目
for(int i = 0;i < k;i++) {
int a = in.nextInt(); //n部分中的顶点
int b = in.nextInt(); //m部分中顶点
map[a][b] = 1;
}
System.out.println(test.getMaxNum(map));
}
}

参考资料:

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

2.二分图最大匹配总结

最新文章

  1. .net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器
  2. React的第一步
  3. Linux下更好用的帮助命令—cheat
  4. OC—设计模式-通知的使用
  5. python简单网络服务器
  6. IDEA中Maven管理下添加mysql依赖
  7. python 自动化运维项目_目录
  8. 去除ios反调试
  9. JS函数的参数声明中用 var 与不用 var的区别
  10. hadoop入门级总结二:Map/Reduce
  11. .NET之JSON序列化运用
  12. POJ 1821 Fence (算竞进阶习题)
  13. Flutter - BottomNavigationBar底部导航栏切换后,状态丢失。底部
  14. java - 并发编程易错实例
  15. Integral transform 积分变换
  16. LightOJ 1296 Again Stone Game(sg函数)题解
  17. golang 如何查看程序执行消耗时间
  18. 浅谈iOS与社交化网络
  19. Python 学习经历分享
  20. Oracle实例初始化参数详解

热门文章

  1. hdu 3949 XOR 线性基 第k小异或和
  2. BZOJ1509 [NOI2003]逃学的小孩 树型DP
  3. 72.2801 LOL-盖伦的蹲草计划(广搜)
  4. js异步处理工作机制(setTimeout, setInterval)
  5. HDU 5292 Pocket Cube 结论题
  6. 【转】2012年7月12 – 腾讯公司 WEB高级应用开发工程师 最新面试题
  7. Android Studio Beat版公布!
  8. java Integer包装类装箱的一个细节
  9. 使用Redisson实现分布式锁
  10. 从Log4j迁移到LogBack的理由