二分图的最大权匹配

二分图的最大权匹配

二分图的最大匹配

匈牙利算法

思路:将点分为两类,左边的点和右边的点。每次尝试给左边的点找一个右边的点与之匹配,

for (int i = 1; i <= n; ++i) {
            Arrays.fill(st, false);//为什么要每次都要重置st
            if (find(i)) res++;
        }

for循环遍历左边的点,find(i)表示尝试给左边的i号节点找一个匹配点。

static boolean find(int u) {
        for (int i = h[u]; i != -1; i = ne[i]) {
            int j = e[i];
            if (!st[j]) {//在本次匹配中j没有被访问过
                st[j] = true;
                if (match[j] == 0 || find(match[j])) {
                    match[j] = u;
                    return true;
                }
            }
        }
        return false;
    }

for循环遍历与节点u相连的右边的点,如果右边的点还处在待匹配状态match[j] == 0,则让他与节点u匹配。如果右边的点已经被匹配,与之匹配的左边的点是match[j],尝试让match[j]匹配其它的右边点,所以有find(match[j])。那么这里要问,通过什么保证,我再次进入find函数的时候,不会与j匹配呢?那就是st函数,我们可以看见,在进行匹配时我优先判断了当前节点的st值是否为真,如果为真,表示当前这个节点已经被占用了,我就不能和他匹配了。那么我们最初进行find(u)的时候,只要进入了某个右边节点,我就把它的st值标为真,相当于先把他占有。如果find(match[j])返回为真,就说明当前的节点u可以和节点j匹配,否则就不行。这里注意st数组只对当前匹配有效,如果我要进行下一个左节点的匹配了,要先给他初始化一下。

二分图的最大权完美匹配

KM算法

主要思想:
要求最大权匹配,贪心的思路我想选权值最大的边进行匹配,除非这些边没有办法让我完成匹配,我再去选权值次大的边。

顶标和相等子图的概念:
左边的点标记一个左顶标,右边的点标记一个右顶标,如果一条边上连接的左右两个点的顶标之和等于边的权值,那么这条边就在相等子图里,在匹配的时候我们就可以用这条边。

初始化:

for(int i=1;i<=n;i++) la[i]=-INF;
for(int i=1;i<=n;i++)
	 for(int j=1;j<=n;j++) 
	     la[i]=Math.max(la[i],w[i][j]);//给左顶标初始化为最大值
 for(int i=1;i<=n;i++) lb[i]=0;//给右顶标初始化为0      

左顶标初始化为所连边的最大权值,右顶标初始化为0,此时相当于把左边点所连权值最大的边加入到了相等子图里,如下图所示,蓝色的边为当前可以用的边。

在这里插入图片描述

匈牙利算法进行匹配:
数组va用来标记左边的点是否在交替路中,数组vb用来标记右边的点是否在交替路中同时也表示右边的点在本次匹配过程是否被访问过。如果当前边在相等子图里,那么就尝试匹配。如果不在相等子图里,则记录当前边所连点的左右顶标之和与边权的差值,la[x]+lb[y]-w[x][y]。在匹配的过程中,我只使用蓝色的边。左边的1号点和右边的2号点匹配,左边的2号点也想和右边的2号点匹配,尝试让左边的1号点找其他匹配边,但是没有其他可用边了,匹配失败。

static boolean dfs(int x){//匈牙利算法
	    va[x]=1; //x在交替路中
	    for(int y=1;y<=n;y++){
	      if(vb[y]==0){//点是否可用
	          if(la[x]+lb[y]-w[x][y]==0){//相等子图 边是否可用
	              vb[y]=1; //y在交替路中
	              if(match[y]==0||dfs(match[y])){
	                match[y]=x; //配对
	                return true;
	              }
	          }
	          else //不是相等子图则记录最小的d[y]
	            d[x]=Math.min(d[x],la[x]+lb[y]-w[x][y]);
	      }
	    }
	    return false;
	}

加入新的边:
接下来我们重点分析式子la[x]+lb[y]-w[x][y]

  1. 如果边(x,y)不在相等子图里,la[x]+lb[y]表示的是左边点x在相等子图里的边的最小值。

  2. la[x]+lb[y]-w[x][y]相等子图里的边的最小值与不在相等子图里的边之差,注意一点,一旦要加边,必然是左边某两个点在匹配过程中发生了矛盾,还是刚刚那个例子,发生了失配,假设我要加一条与左节点1相连的边,其实就意味着让左节点1连当前加入的这条边,让他放弃原本的边,那么这个过程其实有一个代价,代价就是原本1号左节点能够连到的权值最小的边的权值减去当前加入边的权值。将(1,1)这条边加入的代价是2+0-1=1,这里的2+0就是1号点能够连到的权值最小的边的权值。将(2,3)这条边加入的代价是7+0-3=4,这里的7+0就是2号点能够连到的权值最小的边的权值。可以看见将边(1,1)加入付出的代价最小,所以将这条边加入。

在这里插入图片描述

为了将边(1,1)加入如何修改顶标?1号左节点顶标减1后,就将边(1,1)加入了,但是会产生“蝴蝶效应”,(1,2)边仍然要在相等子图里,1号左节点顶标减1,为了保持左右顶标之和不变,2号右节点顶标加1,(2,2)边仍然要在相等子图里,2号右节点顶标加1,为了保持左右顶标之和不变,2号左节点顶标减1。1其实就是最小的delta,重新构图的过程其实就是求最小的delta,然后左顶标加delta,右顶标减delta。哪些节点的顶标要发生变化呢?当然是在匹配过程中走到的节点,在代码里用va和vb标注了。

for(int i=1;i<=n;i++){//给每一个点寻找匹配点
	 while(true){//直到左点i找到匹配
	    Arrays.fill(va,0);
	    Arrays.fill(vb,0);
	    Arrays.fill(d,INF);
	    if(dfs(i))break;//走匈牙利算法
	    long delta=INF;
	     for(int j=1;j<=n;j++)
	        delta=Math.min(delta,d[j]);
	     for(int j=1;j<=n;j++){//修改顶标
	        if(va[j]!=0)la[j]-=delta;//左边的点-delta
	        if(vb[j]!=0)lb[j]+=delta;//右边的点+delta
	      }
	  }
}

新建好的图如下,现在再走匈牙利算法,1号左节点和1号右节点匹配,2号左节点和2号右节点匹配,3号左节点也想和1号右节点匹配,再次发生失配。边(2,3)加入的代价是6+0-3=3,边(3,3)加入的代价是8+0-1=7,因此将边(2,3)加入。

在这里插入图片描述

新建好的图如下,现在再走匈牙利算法,1号左节点和1号右节点匹配,2号左节点和2号右节点匹配,3号左节点也想和1号右节点匹配,1号左节点和2号右节点匹配,2号左节点和3号右节点匹配,此时3号左节点可以和1号右节点匹配。

在这里插入图片描述
匹配结果如下,
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/287100.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业CIO如何面对数字化转型

随着互联网新技术的不断发展&#xff0c;必将导致商业模式的改变&#xff0c;企业信息化的内涵也将发生改变。IT在企业的定位更可能会上升到合作伙伴型与引领型这些较高的层面&#xff0c;IT架构模式、系统建设模式、IT部门结构等都将发生质变。而数字化时代必定属于CIO的时代&…

浅谈余压监控系统在某高层住宅的应用方案

【摘要】&#xff1a; 本文介绍了余压监控系统的基本架构和功能&#xff0c;结合某高层住宅建设实例分析了高层民用建筑中设置此系统的优点与必要性&#xff0c;总结了余压监控系统的功能用于高层建筑物中楼梯间和前室、前室和走道之间的余压的监控与调节&#xff0c;使监控区域…

第一个Qt程序----Hello word!

从今天起就开始我们的第一个Qt小程序&#xff0c;点击New Project后点击右侧的Application后点击Qt Widgets Application。Qt Widgets 模块提供了一组UI元素用于创建经典的桌面风格的用户界面&#xff0c;Widgets是小部件的意思&#xff0c;也可以称为控件&#xff0c;因此Qt …

DevOps成熟度评估模型

什么是DevOps 随着敏捷软件方法的广泛采用&#xff0c;以及IT基础设施即程序代码的管理方式的推广&#xff0c;DevOps也应运而生了。 DevOps 是通过人、流程和技术的有机整合&#xff0c;以协作、自动化、精益、度量和共享文化为指引&#xff0c;旨在建立一种可以快速交付价值…

嵌入式-C语言-const关键字-指针常量和常量指针

C语言-指针常量和常量指针 一&#xff1a;结论 1.常量指针 &#xff1a;b的值不能变&#xff0c;但是b的地址能变 const int* b &x; 2.指针常量&#xff1a;p的地址不能变&#xff0c;但是p的值能变 int* const p &y; 3.巧记口诀 星在&#xff08;const&#xf…

autograd与逻辑回归

一、autograd—自动求导系统 torch.autograd.backward() torch.autograd.backward()是PyTorch中用于计算梯度的函数。以下是对该函数的参数的解释&#xff1a; 功能&#xff1a;自动求取梯度 • tensors: 用于求导的张量&#xff0c;如 loss • retain_graph : 保存计算图 •…

Zero-shot:半监督:pansharpening

Zero-shot semi-supervised learning for pansharpening &#xff08;用于全色锐化的零次半监督学习&#xff09; 全色锐化是指融合低分辨率多光谱图像&#xff08;LRMS&#xff09;和高分辨率全色&#xff08;PAN&#xff09;图像以生成高分辨率多光谱图像&#xff08;HRMS&…

安卓学习笔记

一、eclipse问题记录 &#xff08;1&#xff09;."Android requires compiler compliance level 5.0 or 6.0.Found 1.3 instead. Please useAndroid Tools > Fix Project Properties." 问题描述&#xff1a;"Android要求编译器兼容级别为5.0或6.0。但找到的…

GZ075 云计算应用赛题第3套

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷3 某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenSt…

720VR全景通微信小程序商业运营版+多用户+云储存+大图切图效率高+完整的代码包以及搭建教程 功能强大

随着科技的飞速发展&#xff0c;虚拟现实技术已经逐渐融入我们的日常生活。其中&#xff0c;720VR全景技术以其独特的视角和沉浸式体验&#xff0c;受到了广泛的关注和应用。为了满足市场需求&#xff0c;春哥团队推出了720VR全景通微信小程序商业运营版&#xff0c;集多用户、…

Python - 深夜数据结构与算法之 DP

一.引言 常规算法介绍的差不多&#xff0c;最不喜欢的动态规划 Dynamic Programming 还是来啦&#xff0c;前面介绍贪心算法时以及一些最大最小收益等等的问题&#xff0c;其实都可以套用动态规划的思路来实现的&#xff0c;下面我们看看动态规划的思路与模版要点。 二.动态规…

案例分享:Qt多国语言输入法软键盘

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/135346374 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

HTML制作暴雨特效

🎀效果展示 🎀代码展示 <body> <!-- partial:index.partial.html --> <canvas id="canvas-club">

猫粮有营养吗?性价比高的主食冻干猫粮测评

随着养猫的人越来越多&#xff0c;铲屎官们对猫咪的饮食也越来越注重。除了猫粮&#xff0c;很多铲屎官还会给猫咪准备小零食。那么&#xff0c;猫咪是不是除了猫粮就没有其他可吃的了呢&#xff1f;答案当然不是。猫咪还有猫冻干、冻干猫粮、猫条等可以选择。每个铲屎官都希望…

PostgreSQL荣获DB-Engines 2023年度数据库

数据库流行度排名网站 DB-Engines 2024 年 1 月 2 日发布文章宣称&#xff0c;PostgreSQL 荣获 2023 年度数据库管理系统称号。 PostgreSQL 在过去一年中获得了比其他 417 个产品更多的流行度增长&#xff0c;因此获得了 2023 年度 DBMS。 DB-Engines 通过计算每种数据库 2024 …

opencv期末练习题(5)附带解析

根据R、G、B的值实时修改图像的颜色 import cv2 import numpy as np""" 滑动块调整图像灰度1. 读取图片&#xff0c;并转为灰度图 2. 定义启动滑块和R、G、B滑块 3. 只有启动滑块的值为1时&#xff0c;拖动R、G、B滑块才生效 4. 根据R、G、B的值实时对修改图片的…

【算法设计与分析】期末复习

文章目录 复习大纲第一章算法概述1.1算法与程序1.2 算法复杂性分析 第二章递归与分治策略分治法的基本思想递归与分治的关系&#xff1a;用分治法解决的问题的几个特征&#xff1a;例题&#xff1a; 第三章动态规划动态规划的基本思想&#xff1a;分治与动态规划算法的异同&…

【小白刷机】Pixel手机刷Magick模块不兼容重启卡开机logo解决方式

目录 关于Pixel为什么要刷机&#xff1f;刷机流程1. 手机进入bootloader2. 电脑准备好系统包和SDK工具包下载系统包下载SDK工具包 3. 手机连接电脑4. 修改配置文件&#xff0c;刷入系统小结彩蛋 关于Pixel Pixel作为一台谷歌手机&#xff0c;在国内不使用魔法是基本无法使用的…

【AI故事】灵感的源泉还是知识的盗窃?

灵感的源泉还是知识的盗窃&#xff1f; ——ChatGPT Robot在一个漆黑的夜晚&#xff0c;年轻的作家艾米丽坐在书桌前&#xff0c;手里紧握着一支笔&#xff0c;思绪万千。她一直在寻找创作的灵感&#xff0c;但却毫无头绪。 突然&#xff0c;她听到了一声巨响&#xff0c;仿佛…

计算机基础面试题 |05.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…