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)相关推荐

  1. 二分图带权匹配、最佳匹配与KM算法

    ---------------------以上转自ByVoid神牛博客,并有所省略.   [二分图带权匹配与最佳匹配] 什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值 ...

  2. 【算法笔记】二分图最大权匹配 - KM算法(dfs版O(n4) + bfs版O(n3))

    整理的算法模板合集: ACM模板 匈牙利算法又称为 KM 算法,可以在 O(n3)O(n^3)O(n3) 时间内求出二分图的 最大权完美匹配 . 考虑到二分图中两个集合中的点并不总是相同,为了能应用 ...

  3. Java实现二分图的最大权匹配

    1 问题描述 何为二分图的最大权匹配问题? 最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大. 2 解决方案 解决这个问题可以用KM算法.理解KM算法需要首先理解& ...

  4. hdu 2853Assignment (二分图的最大权匹配)

    //hdu2853 //二分图的最大权匹配,图中有一些边,在等权值的条件下有优先选择权. //因为是选n个进行匹配,我们将每条边的权值扩大(n+1)倍,这样每条边相对大小是一样的 //对于有优先选择权 ...

  5. 二分图带权最大匹配费用流_简单理解二分图与匈牙利算法

    最近在看DETR等论文时时,看到了使用了二分图的最大匹配,对于没有计算机基础的我表示直接上来???,因此本篇博客主要介绍什么是二分图,以及二分图的匹配的匈牙利算法. 首先我们来看看二分图的定义: 二分 ...

  6. java 寻找和为定值的多个数_算法笔记_037:寻找和为定值的两个数(Java)

    1 问题描述 输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数.如果有多对数的和等于输入的整数,输出任意一对即可.例如,如果输入数组[1,2,4,5,7,11,15]和 ...

  7. 二分图带权最大匹配费用流_一文掌握阻抗匹配

    全文约8500字,阅读需要20分钟,记得收藏,分享或者点击 在看哦 我们在上周的文章中,着重介绍了阻抗匹配的相关概念和方法.阻抗匹配,作为射频设计中最为重要的一个环节,每一个射频工程师都无法绕过去的. ...

  8. java 完全背包问题算法_算法笔记(c++)--完全背包问题

    算法笔记(c++)--完全背包和多重背包问题 完全背包 完全背包不同于01背包-完全背包里面的东西数量无限 假设现在有5种物品重量为5,4,3,2,1 价值为1,2,3,4,5 背包容量为10 #in ...

  9. 算法笔记_137:二分图的最大匹配(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为二分图的最大匹配问题? 引用自百度百科: 首先得说明一下何为匹配: 给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于 ...

最新文章

  1. AC日记——信息传递 洛谷 P2661 (tarjan求环)
  2. python运维脚本部署jdk_Jenkins自动执行Python脚本,并输出测试报告
  3. java实验3 2020.4.6
  4. iphone SHSH证书
  5. ExtJs ComboBox 在IE 下 自动完成功能无效的解决方案
  6. mysql查询雇员部门和性别_数据库管理系统MySQL实验
  7. 常用nginx rewrite重定向-跳转实例
  8. 设计模式----简单工厂
  9. sql 判断条件累加_SQL 是描述性语言?
  10. php报错集合,centos7安装php5.6报错集合
  11. MongoDB中对象反序列化的一个小问题
  12. Linux内核加载f2fs,固态硬盘使用f2fs文件系统作为deepin引导分区经验
  13. pytorch torchvision 各种版本whl下载地址
  14. 已下载好的OpenCV4.5.5 CMake .cache文件夹
  15. vue去除input在360兼容模式下删除图标
  16. iOS 支付宝手机网站支付
  17. python的eval函数
  18. 关于 AWS 架构师认证考试
  19. c语言程序输入与输出函数,C语言printf()和scanf()函数?其实就是输入输出
  20. Csharp日常笔记

热门文章

  1. 【机器人】多传感器融合定位前沿技术小笔记
  2. 「 机器人学 」“机器人定位技术”浅谈
  3. 计算机科学技术学院博逸楼,燕儿岛路附近校内附属设施
  4. 基于JAVA大学生第二课堂计算机毕业设计源码+系统+lw文档+部署
  5. Vue2中ref属性的用法
  6. 8行python代码领取联通青啤活动流量30MB.2021-1-13修
  7. Wwise音频解决方案概述
  8. 智慧司法三维可视化决策系统平台(数字孪生)-解决方案开发案例
  9. FZU 1921 栀子花开 (线段树单点更新)
  10. Visual Studio 2019 界面开发开启控制台