java 二分图带权匹配_算法笔记_139:二分图的最大权匹配(Java)
packagecom.liuzhen.practice;importjava.util.Scanner;public classMain {public static int MAX = 100;public static intn;public static int[][] value = new int[MAX][MAX]; //给定二分图的权重值
public static int[] lx = new int[MAX]; //记录二分图左半部分顶点的可行顶标
public static int[] ly = new int[MAX]; //记录二分图右半部分顶点的可行顶标
public static boolean[] sx = new boolean[MAX];//用于记录二分图左半部分顶点是否在最终结果中
public static boolean[] sy = new boolean[MAX];//用于记录二分图右半部分顶点是否在最终结果中
public static int[] pre = new int[MAX]; //用于记录最终结果中顶点y匹配的顶点x
public boolean dfs(int x) { //采用匈牙利算法找增广路径
sx[x] = true; //代表左半部分顶点x包含在最终结果中
for(int y = 0;y < n;y++) {if(!sy[y] && lx[x] + ly[y] ==value[x][y]) {
sy[y]= true; //代表右半部分顶点y包含在最终结果中
if(pre[y] == -1 ||dfs(pre[y])) {
pre[y]=x;return true;
}
}
}return false;
}public int getKM(intjudge) {if(judge == -1) { //代表寻找二分图的最小权匹配
for(int i = 0;i < n;i++)for(int j = 0;j < n;j++)
value[i][j]= -1 * value[i][j]; //把权值变为相反数,相当于找最大权匹配
}//初始化lx[i]和ly[i]
for(int i = 0;i < n;i++) {
ly[i]= 0;
lx[i]=Integer.MIN_VALUE;for(int j = 0;j < n;j++) {if(value[i][j] >lx[i])
lx[i]=value[i][j];
}
}for(int i = 0;i < n;i++)
pre[i]= -1; //初始化右半部分顶点y的匹配顶点为-1
for(int x = 0;x < n;x++) { //从左半部分顶点开始,寻找二分图完美匹配的相等子图完美匹配
while(true) {for(int i = 0;i < n;i++) {//每次寻找x的增广路径,初始化sx[i]和sy[i]均为被遍历
sx[i] = false;
sy[i]= false;
}if(dfs(x)) //找到从x出发的增广路径,结束循环,寻找下一个x的增广路径
break;//下面对于没有找到顶点x的增广路径进行lx[i]和ly[i]值的调整
int min =Integer.MAX_VALUE;for(int i = 0;i < n;i++) {if(sx[i]) { //当sx[i]已被遍历时
for(int j = 0;j < n;j++) {if(!sy[j]) { //当sy[j]未被遍历时
if(lx[i] + ly[j] - value[i][j]
min= lx[i] + ly[j] -value[i][j];
}
}
}
}if(min == 0)return -1;for(int i = 0;i < n;i++) {if(sx[i])
lx[i]= lx[i] -min;if(sy[i])
ly[i]= ly[i] +min;
}
}
}int sum = 0;for(int y = 0;y < n;y++) {
System.out.println("y顶点"+y+"和x顶点"+pre[y]+"匹配");if(pre[y] != -1)
sum= sum +value[pre[y]][y];
}if(judge == -1)
sum= -1 *sum;returnsum;
}public static voidmain(String[] args) {
Main test= newMain();
Scanner in= newScanner(System.in);
n=in.nextInt();int k = in.nextInt(); //给定二分图的有向边数目
for(int i = 0;i < k;i++) {int x =in.nextInt();int y =in.nextInt();int v =in.nextInt();
value[x][y]=v;
}
System.out.println(test.getKM(1));
}
}
java 二分图带权匹配_算法笔记_139:二分图的最大权匹配(Java)相关推荐
- 二分图带权匹配、最佳匹配与KM算法
---------------------以上转自ByVoid神牛博客,并有所省略. [二分图带权匹配与最佳匹配] 什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值 ...
- 【算法笔记】二分图最大权匹配 - KM算法(dfs版O(n4) + bfs版O(n3))
整理的算法模板合集: ACM模板 匈牙利算法又称为 KM 算法,可以在 O(n3)O(n^3)O(n3) 时间内求出二分图的 最大权完美匹配 . 考虑到二分图中两个集合中的点并不总是相同,为了能应用 ...
- Java实现二分图的最大权匹配
1 问题描述 何为二分图的最大权匹配问题? 最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大. 2 解决方案 解决这个问题可以用KM算法.理解KM算法需要首先理解& ...
- hdu 2853Assignment (二分图的最大权匹配)
//hdu2853 //二分图的最大权匹配,图中有一些边,在等权值的条件下有优先选择权. //因为是选n个进行匹配,我们将每条边的权值扩大(n+1)倍,这样每条边相对大小是一样的 //对于有优先选择权 ...
- 二分图带权最大匹配费用流_简单理解二分图与匈牙利算法
最近在看DETR等论文时时,看到了使用了二分图的最大匹配,对于没有计算机基础的我表示直接上来???,因此本篇博客主要介绍什么是二分图,以及二分图的匹配的匈牙利算法. 首先我们来看看二分图的定义: 二分 ...
- java 寻找和为定值的多个数_算法笔记_037:寻找和为定值的两个数(Java)
1 问题描述 输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数.如果有多对数的和等于输入的整数,输出任意一对即可.例如,如果输入数组[1,2,4,5,7,11,15]和 ...
- 二分图带权最大匹配费用流_一文掌握阻抗匹配
全文约8500字,阅读需要20分钟,记得收藏,分享或者点击 在看哦 我们在上周的文章中,着重介绍了阻抗匹配的相关概念和方法.阻抗匹配,作为射频设计中最为重要的一个环节,每一个射频工程师都无法绕过去的. ...
- java 完全背包问题算法_算法笔记(c++)--完全背包问题
算法笔记(c++)--完全背包和多重背包问题 完全背包 完全背包不同于01背包-完全背包里面的东西数量无限 假设现在有5种物品重量为5,4,3,2,1 价值为1,2,3,4,5 背包容量为10 #in ...
- 算法笔记_137:二分图的最大匹配(Java)
目录 1 问题描述 2 解决方案 1 问题描述 何为二分图的最大匹配问题? 引用自百度百科: 首先得说明一下何为匹配: 给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于 ...
最新文章
- AC日记——信息传递 洛谷 P2661 (tarjan求环)
- python运维脚本部署jdk_Jenkins自动执行Python脚本,并输出测试报告
- java实验3 2020.4.6
- iphone SHSH证书
- ExtJs ComboBox 在IE 下 自动完成功能无效的解决方案
- mysql查询雇员部门和性别_数据库管理系统MySQL实验
- 常用nginx rewrite重定向-跳转实例
- 设计模式----简单工厂
- sql 判断条件累加_SQL 是描述性语言?
- php报错集合,centos7安装php5.6报错集合
- MongoDB中对象反序列化的一个小问题
- Linux内核加载f2fs,固态硬盘使用f2fs文件系统作为deepin引导分区经验
- pytorch torchvision 各种版本whl下载地址
- 已下载好的OpenCV4.5.5 CMake .cache文件夹
- vue去除input在360兼容模式下删除图标
- iOS 支付宝手机网站支付
- python的eval函数
- 关于 AWS 架构师认证考试
- c语言程序输入与输出函数,C语言printf()和scanf()函数?其实就是输入输出
- Csharp日常笔记
热门文章
- 【机器人】多传感器融合定位前沿技术小笔记
- 「 机器人学 」“机器人定位技术”浅谈
- 计算机科学技术学院博逸楼,燕儿岛路附近校内附属设施
- 基于JAVA大学生第二课堂计算机毕业设计源码+系统+lw文档+部署
- Vue2中ref属性的用法
- 8行python代码领取联通青啤活动流量30MB.2021-1-13修
- Wwise音频解决方案概述
- 智慧司法三维可视化决策系统平台(数字孪生)-解决方案开发案例
- FZU 1921 栀子花开 (线段树单点更新)
- Visual Studio 2019 界面开发开启控制台