算法笔记_137:二分图的最大匹配(Java)
2024-08-27 01:17:23
目录
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));
}
}
参考资料:
最新文章
- .net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器
- React的第一步
- Linux下更好用的帮助命令—cheat
- OC—设计模式-通知的使用
- python简单网络服务器
- IDEA中Maven管理下添加mysql依赖
- python 自动化运维项目_目录
- 去除ios反调试
- JS函数的参数声明中用 var 与不用 var的区别
- hadoop入门级总结二:Map/Reduce
- .NET之JSON序列化运用
- POJ 1821 Fence (算竞进阶习题)
- Flutter - BottomNavigationBar底部导航栏切换后,状态丢失。底部
- java - 并发编程易错实例
- Integral transform 积分变换
- LightOJ 1296 Again Stone Game(sg函数)题解
- golang 如何查看程序执行消耗时间
- 浅谈iOS与社交化网络
- Python 学习经历分享
- Oracle实例初始化参数详解
热门文章
- hdu 3949 XOR 线性基 第k小异或和
- BZOJ1509 [NOI2003]逃学的小孩 树型DP
- 72.2801 LOL-盖伦的蹲草计划(广搜)
- js异步处理工作机制(setTimeout, setInterval)
- HDU 5292 Pocket Cube 结论题
- 【转】2012年7月12 – 腾讯公司 WEB高级应用开发工程师 最新面试题
- Android Studio Beat版公布!
- java Integer包装类装箱的一个细节
- 使用Redisson实现分布式锁
- 从Log4j迁移到LogBack的理由